在嵌入式应用中,模拟到数字转换器是将现实世界中的模拟信号温度、光照、电压转换为微控制器可以处理的数字值的关键外设。
APM32E030R内置一个12位精度的逐次逼近型ADC,支持多达10个外部通道。
我奖详细评测如何在该开发板上使用ADC,并以PA0(ADC通道0)为例,读取模拟电压并通过串口打印结果。
一、硬件连接与原理
ADC通道与引脚对应关系:
APM32E030R的ADC通道0对应引脚为 PA0。这是本次评测的目标引脚。
开发板上PA0引脚已引出,方便连接。
二、连接图与解释
信号源选择
电位器:将电位器的三个引脚分别连接到开发板的3.3V、GND和中间引脚连接到PA0。旋转电位器即可改变PA0的输入电压(0~3.3V)。
可调电源:使用一个精确的可调电源,将其正极连接到PA0,负极连接到GND。缓慢调节电压进行测试。
分压电路:使用两个电阻构成分压电路,为PA0提供一个固定的电压。这样就可以出来一个固定的电压值,这里我用电位器来模拟,就以高低来实现效果。
三、代码
- void ADC_Isr()
- {
- uint32_t adcData = 0;
- uint32_t voltage = 0;
- APM_TINY_LEDOff(LED2);
- APM_TINY_LEDOff(LED3);
- if (ADC_ReadIntFlag(ADC_INT_FLAG_CS) == SET)
- {
- /* The interrupt flag bit must be cleared first. */
- ADC_ClearIntFlag(ADC_INT_FLAG_CS);
- /* Read ADC Conversion value */
- adcData = ADC_ReadConversionValue();
- /* voltage(mV) = adcData * (3300mV / 4095) */
- voltage = (adcData * 3300) / 4095;
- /* output to serial port */
- printf("\r\n volatage : %" PRId32 " mV\r\n", voltage);
- Delay_2s();
- }
- if (ADC_ReadIntFlag(ADC_INT_FLAG_AWD) == SET)
- {
- /* The interrupt flag bit must be cleared first. */
- ADC_ClearIntFlag(ADC_INT_FLAG_AWD);
- if (adcData < awltVoltage)
- {
- APM_TINY_LEDOn(LED2);
- APM_TINY_LEDOff(LED3);
- }
- else if (adcData > awhtVoltage)
- {
- APM_TINY_LEDOff(LED2);
- APM_TINY_LEDOn(LED3);
- }
- printf("\r\n Analog watchdog interrupt !\r\n");
- Delay_2s();
- }
- }
- int main(void)
- {
- APM_TINY_LEDInit(LED2);
- APM_TINY_LEDInit(LED3);
- APM_TINY_COMInit(COM1);
- ADCInit();
- Delay_2s();
- printf("The analog watchdog High threshold : %d mV\r\n", (awhtVoltage * 3300) / 4096);
-
- Delay_2s();
- printf("The analog watchdog low threshold : %d mV\r\n", (awltVoltage * 3300) / 4096);
- /* Wait until ADC is ready */
- while (!ADC_ReadStatusFlag(ADC_FLAG_ADRDY));
- Delay_2s();
- ADC_StartConversion();
- Delay_2s();
- for (;;)
- {
- }
- }
四、实际输出结果
|