Chủ Nhật, 8 tháng 1, 2012

Lap trinh ARM (phan 1)

 1.Lập trình LCD 16x2 ở chế độ 4-bits với STM32



 

Trích nguồn: ARM VietNam 

Chương trình chạy trên kít OPENCMX-STM3210D; hiển thị dòng chữ "Sharing Tech in ARM Viet Nam". Ví dụ mẫu này sẽ nêu lên vài điểm cần chú ý khi giao tiếp LCD 16x2 ở chế độ 4-bits.

 

 

 

Các chú ý quan trọng:
-   Các chân D0-D3 được để trống hoặc kết nối xuống GND.
-   Vì mặc định LCD hoạt động mode 8 bit, do đó khi mới khởi động LCD sẽ vào chế độ 8 bit nên nếu ta thiết lập cho LCD mode 4-bit ngay từ đầu thì LCD sẽ không hiểu. Do đó để LCD hiểu ta muốn giao tiếp ở mode 4-bit thì cần một lệnh giả lập cho LCD, bằng cách gửi lệnh (như bên dưới) trước khi gọi hàm LCD_Function_Set():

/* Set 4-bits interface */
lcd_Control_Write(0x33);
Delay(10);
lcd_Control_Write(0x32);
Lưu ý là điều này còn tùy vào loại LCD( một số LCD cũng không cần tới lệnh giả này mà chỉ cần 1 delay() nhỏ thì cũng ok)
-    Cần chú ý đến quá  trình thao tác đến 4 đường Data trong hàm lcd_data_line_write(u8 data) , có thể sẽ tác động đến các chân điều khiển nếu dùng chung 1 Port ( Cần phải dùng các phép toán AND, OR thích hợp).


Tải chương trình nguồn ở đây. Ngoài ra có thể tham khảo thêm demo giao tiếp LCD 16x2 ở chế độ 8-bits với STM32 ở đây.

 

2.Lập trình ADC

 

Ở bài này chúng ta sẽ tiếp cận cách sử dụng bộ ADC của STM32F103RC thông qua các ứng dụng chuyển đổi giá trị tín hiệu tương tự sang số.  

  1 Môi trường phát triển phần cứng

 

1.1 Hỗ trợ ADC của GEM3v0.1
Ở board GEM3v0.1, có nhiều chân được thiết kế dành riêng cho các tác vụ tổng hợp như: GPIOs, PWM, ADC, DAC, TIMER, Temperature sensor,…











 

Ở hình trên ta thấy chân số 14 của STM32F103x được thiết kế đa chức năng. Ở ví dụ này, chúng ta sẽ sử dụng nó như là đầu vào dữ liệu cho bộ ADC.
Một số đặc tính cơ bản của bộ ADC của STM32F103x:
+ Độ phân giải 12-bit và tần suất lấy mẫu là 56MHz(khoảng 1us một mẫu).
+ 18 kênh chuyển đổi trong đó: 16 kênh dành cho tín hiệu ngoại được đánh số lần lượt từ: AIN0,AIN1,…AIN15; 2 kênh còn lại dành cho cảm biến nhiệt nội và vôn kế nội.
+ Bộ ADC được cấp nguồn riêng từ 2.4V đến 3.6V.
+ Hỗ trợ 2 loại chuyển đổi: regular, injected.
Ở board GEM31v0.1, bộ ADC được cấp nguồn trực tiếp 3.3V. Điện áp tham chiếu Vref+ bằng 3.3V.
Độ phân giải 12bit cho phép mã hóa các tín hiệu tương tự từ 0->3.3 sang giá trị số từ 0->4095.  Giá trị lượng tử được tính bằng:
Quantizer = 3.3 / 2^12 = 3.3/4096 = 0.8mV


1.2 Cảm biến nhiệt LM35DZ
Cảm biến nhiệt LM35DZ gồm 3 chân:











 

Nguồn cung cấp cho chân +Vs vào khoảng từ 4V đến 30V.  Ở chân xuất dữ liệu, khi nhiệt độ bằng 0 điện áp ra sẽ là 0V. Cảm biến này đo nhiệt độ theo thang Celcius. Cứ mỗi một đơn vị nhiệt độ sẽ tương ứng với 10mV. Và mức thay đổi là tuyến tính. Ví dụ nếu nhiệt độ hiện giờ là 25 độ Celcius, thì điện áp xuất sẽ là 10mVx25 = 250mV. Như vậy, với giá trị lượng tử là 0.8mV, chúng ta hoàn toàn có khả năng lấy mẫu chính xác giá trị từ cảm biến nhiệt.
Trong ứng dụng tích hợp với board GEM3v0.1, nguồn cấp cho cảm biến là 5V.
Sơ đồ mạch kết nối với STM32 được thiết kế như sau:











 

2 Cấu trúc chương trình
2.1 Sơ đồ khối











 

2.2 Cấu hình hoạt động ADC










 

Giải thích:
(1): Sử dụng hàm chuẩn thư viện CMSIS RCC_APB2PeriphClockCmd để kích hoạt các ngoại vi trên APB2, ở đây ta kích hoạt ADC1:







RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

(2): Để nhận được dữ liệu dạng tương tự, ta phải cấu hình chân dữ liệu hoạt động ở chế độ Analog Input. Ở demo này, ta sử dụng chân số 14 , tương ứng là chân 0(GPIO_Pin_0) của Port A(GPIOA) , ký hiệu là PA0






GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);

(3): Cấu hình chế độ hoạt động của ADC1






ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);

(4): Cấu hình ADC Channel, ở ví dụ này, ta cấu hình ADC Channel 0 (ADC_Channel_0)  hoạt đông như là Regular Channel với thời gian lấy mẫu là 55 chu kỳ






ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);

(5): Kích hoạt bộ ADC1






ADC_Cmd(ADC1, ENABLE);

(6): Kích hoạt Reset Calibration, khởi động lại bộ lấy mẫu chuẩn và chờ cho quá trình tái khởi động hoàn tất






ADC_ResetCalibration(ADC1);

while(ADC_GetResetCalibrationStatus(ADC1));
(7): Kích hoạt chế độ lấy mẫu và cũng chờ cho nó hoàn tất







ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));

(8): Kích hoạt chế độ chuyển đổi






ADC_SoftwareStartConvCmd(ADC1, ENABLE);

2.3 Đọc dữ liệu từ LM35DZ
Chân dữ liệu của LM35DZ được nối trực tiếp tới chân PA0. Để đọc dữ liệu đã được chuyển đổi bởi khối ADC1 ta sử dụng hàm







uint16_t adc = 0;
adc = ADC_GetConversionValue(ADC1);

Giá trị này đã được lượng tử hóa , do đó chúng ta phải tính toán lại giá trị thực theo công thức:
Điện áp thực = Vref * (Giá trị lượng tử) / 2^n
= 3.3 * (giá trị lượng tử)/ 4096.
Giả sử giá trị chuyển đổi đọc từ ADC1 là 251, khi đó điện áp thực nhận từ LM35DZ là:
Điện áp thực = 3.3 * 251 / 4096  = 202mV
Khi đó nhiệt độ thực sẽ là:
Nhiệt độ thực = Điện áp thực / 10 = 20.2 độ C


3. Tài nguyên chương trình

Download dự án ở đây.

Các bạn dùng cáp cổng COM nối board với máy tính để coi giá trị đọc từ cảm biến.

0 nhận xét:

Đăng nhận xét