Custom Search



Nơi bạn đến là nơi tôi bắt đầu, nơi tôi qua sẽ là nơi bạn đến...

Friday, October 19, 2012

Cấu Trúc Cơ bản STM32- Sử Dụng ADC Của STM32F103RC

Ở 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.

Trích nguồn http://www.arm.vn

Post a Comment