ĐẠI HỌC QUỐC GIA TPHCMTRƯỜNG ĐẠI HỌC BÁCH KHOABÁO CÁO BÀI TẬP LỚNMÔN: ĐO LƯỜNG ĐIỀU KHIỂN BẰNG MÁY TÍNHCHỦ ĐỀ: STM32F103C8T6GVHD: NGUYỄN HOÀNG GIÁP... Tạo giao diện C# kết nối cổng UARTS
Trang 1ĐẠI HỌC QUỐC GIA TPHCM
TRƯỜNG ĐẠI HỌC BÁCH KHOA
🙦🙦🙦
BÁO CÁO BÀI TẬP LỚN
MÔN: ĐO LƯỜNG ĐIỀU KHIỂN BẰNG MÁY TÍNH
CHỦ ĐỀ: STM32F103C8T6
GVHD: NGUYỄN HOÀNG GIÁP
Trang 2MỤC LỤC
1 Tạo giao diện C# kết nối cổng UART 3
2 Sử dụng Ngắt UART dùng để bật tắt LED 3
a Kết nối phần cứng 3
b Giải thích code 4
3 Sử giá trị cảm biến (LM35) chuyển đổi ADC 5
a.Kết nối phần cứng 5
b.Giải thích code 6
4 I2C dùng EEPROM AT24C256 7
5 Giao tiếp SPI với MAX7219 (8 led 7 đoạn) 7
a.Kết nối phần cứng 7
b Giải thích code 7
6 Dùng Opto đóng ngắt 12v 9
a Kết nối phần cứng 9
b Giải thích code 9
Trang 3Tạo giao diện C# kết nối cổng UART
Sử dụng Ngắt UART dùng để bật tắt LED
a Kết nối phần cứng
Sử dụng dụng UART1 để truyền nhận dữ liệu
Chân PA0,PA2 làm chân GPIO_Output
Trang 4b Giải thích code
// KHAI BAO BIEN//
uint8_t uartRxData;
volatile uint8_t uartRxFlag = 0;
//GỌI HÀM NGẮ$T UART//
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if (huart->Instance == USART1)
{
uartRxFlag = 1;
//NẾ$U LÀ UART1 THÌ CHO CỜ LẾN1//
}
}
HAL_UART_Receive_IT(&huart1, (uint8_t*)RX_DATA,1);
//CHỜ NHẬN DỮ LIỆU TỪ UART//
//TIẾ$N VÀO HÀM WHILE//
while (1)
{
if (uartRxFlag)
//kiểIm tra cờ, khi có dữ liệu từ uart cờ này sẽ đặt lển 1//
{
switch (uartRxData)
//kiểIm tra giá trị cuIa uart đểI thực hiện 1 số$ lệnh dưới//
{
case '1':
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, 1);
break;
case '4':
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, 0);
case '2':
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, 1);
break;
case '5':
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, 0);
break;
default:
// nể$u ko có case phù hợp thì default giúp ko xaIy ra hành
Trang 5động nào khác //
break;
}
uartRxFlag = 0;
// sau khi xưI lí dữ liệu cờ sẽ xóa vểf 0//
HAL_UART_Receive_IT(&huart1, &uartRxData, 1);
//chờ nhận dữ liệu uart tiể$p theo//
}
Sử giá trị cảm biến (LM35) chuyển đổi ADC
a.Kết nối phần cứng
- Sử dụng ADC1 (PA1) : Chuyển tín hiệu analog thành digital
- Chuyển đổi ADC thành điện áp:
Giá trị ADC được nhân 3.3 (điện áp tham chiếu), sau đó chia cho 4095 giá trị tối đa của ADC, tương ứng với điện áp tham chiếu
Tính nhiệt độ bằng cách *100 do LM35 có độ nhạy 10mV/ độ C, điện áp tương ứng 1 độ
là 0.1V hoặc 10mV
Trang 6b.Giải thích code
// khai báo biể$ n //
float temperature ;
uint16_t adc_value ;
// chuyểI n đốI i ADC thành voltage//
float convertToTemperature (uint16_t adc_value ) {
// V = Vref * (ADC_value / 4095))//
float voltage float ) adc_value 3.3f 4095.0f;
return voltage 100.0f;
}
void Tem ( void )
{
HAL_ADC_Start(&hadc1);
if (HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY) == HAL_OK)
//DOC GIA TRI ADC//
adc_value HAL_ADC_GetValue(&hadc1);
//CHUYEN GIA TRI ADC THANH NHIET DO//
temperature convertToTemperature ( adc_value );
//GIA TRI NHIET DO QUA UART//
}
}
while (1)
{
Tem ();
char uart_data [50];
Trang 7sprintf( uart_data , "%.2f\r\n" , temperature );
HAL_UART_Transmit(&huart1, uint8_t*) uart_data , strlen( uart_data ),
HAL_MAX_DELAY);
HAL_Delay(1000);
}
I2C dùng EEPROM AT24C256
a.Kết nối phần cứng
b.Giải thích code
// KHỞ II TẠO BIẾ$N //
#define EEPROM_ADDRESS 0xA0
uint8_t writeData [10] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // D? li?u c?n ghi
uint8_t readData [10]; // D? li?u d?c du?c
Trang 8//DÙNG I2C ĐẾI TRO I TỚI ĐỊA CHII CUIA EEPROM//
void EEPROM_Write (uint16_t address, uint8_t* data , uint16_t dataSize ) {
HAL_I2C_Mem_Write(&hi2c1, EEPROM_ADDRESS , address, I2C_MEMADD_SIZE_16BIT,
data , dataSize , HAL_MAX_DELAY);
}
void EEPROM_Read (uint16_t address, uint8_t* data , uint16_t dataSize ) {
HAL_I2C_Mem_Read(&hi2c1, EEPROM_ADDRESS , address, I2C_MEMADD_SIZE_16BIT,
data , dataSize , HAL_MAX_DELAY);
}
// GỌI LẠI HÀM//
EEPROM_Write (0, writeData , 10);
EEPROM_Read (0, readData , 10);
Giao tiếp SPI với MAX7219 (8 led 7 đoạn)
a.Kết nối phần cứng
- Sử dụng SPI2 để giao tiếp với MAX7219
- SPI2 chế độ Transmit Only Master
- Chân PB15 SP2_MOSI : Master out với chân Data của Max7219
- Chân PB13 SPI2_SCK : đồng bộ Clock với chân CLK của Max7219
-Chân PB12 là chân để kích chân CS của Max7219
Trang 9b Giải thích code
// khai báo biể$ n//
#define DECODEMODE 0x09
#define INTENSITY 0x0A
#define SCANLIMIT 0x0B
#define SHUTDOWN 0x0C
#define DISPLAYTEST 0x0F
void SPI_Send (uint8_t data ) {
// CHO DEN KHI SPI KHONG BAN//
while ( HAL_SPI_GET_FLAG(&hspi2, SPI_FLAG_TXE) == RESET) {}
// GUI DU LIEU QUA SPI//
HAL_SPI_Transmit(&hspi2, data , 1, HAL_MAX_DELAY);
}
// MAX7219 hoạt động khi có một xung cạnh xuố$ ng kích vào chân CS//
// tro I xuố$ ng địa chỉ I và data câf n truy cập
void ADDR_DATA uint8_t data1 , uint8_t data2 ) {
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, 0)
SPI_Send ( data1 );
SPI_Send ( data2 );
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, 1);
Trang 10ADDR_DATA ( SCANLIMIT ,0x07); // HIẾI N THỊ 8 LED
ADDR_DATA ( SHUTDOWN ,0x01); // SÁNG TOÀN BỘ KHI KÍCH
ADDR_DATA ( DISPLAYTEST ,0x00); // CHẾ$ ĐỘ TEST MÀN HÌNH
}
// HIẾI N THỊ SỐ$ 11 TRONG HÀM INT MAIN()//
MAX7129_INIT ();
ADDR_DATA (0X01,0X01);
ADDR_DATA (0X02,0X01);
ADDR_DATA (0X03,0X00);
ADDR_DATA (0X04,0X00);
ADDR_DATA (0X05,0X00);
ADDR_DATA (0X06,0X00);
ADDR_DATA (0X07,0X00);
ADDR_DATA (0X08,0X00);
Dùng Opto đóng ngắt 12v
a Kết nối phần cứng
- Sử dụng chân PA4, ngắt uart để kích cho
b Giải thích code
while (1)
{/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
Trang 11if (uartRxFlag)
{
switch (uartRxData) {
case '3':
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, 1);
break ;
case '6':
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, 0);
break ; }
}