本帖最后由 jinglixixi 于 2024-11-27 19:14 编辑
AT32L021内置了12位的模拟/数字转换器,可通过多达15个外部通道和3个内部通道,并可配置在12/10/8/6位分辨率下采样。 在对通道5进行采集的情况下,通过PA5来输入模拟信号就可完成检测的任务。 为了能直观地观察到检测的结果,就将下面介绍的数码管显示模块与其配合工作,此时数码管所连接的引脚关系为: CLK---PB8 DIN---PB9 CS---PA7
对所用引脚的功能配置函数为: - void smg_config(void)
- {
- gpio_init_type gpio_init_struct;
- crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
- gpio_default_para_init(&gpio_init_struct);
- gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
- gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
- gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
- gpio_init_struct.gpio_pins = GPIO_PINS_7;
- gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
- gpio_init(GPIOA, &gpio_init_struct);
- crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
- gpio_init_struct.gpio_pins = GPIO_PINS_8|GPIO_PINS_9;
- gpio_init(GPIOB, &gpio_init_struct);
- }
实现电压检测的主程序为: - int main(void)
- {
- __IO uint32_t index = 0;
- __IO uint8_t w = 0;
- __IO uint32_t u,V;
- system_clock_config();
- at32_board_init();
- at32_led_off(LED2);
- at32_led_off(LED3);
- at32_led_off(LED4);
- uart_print_init(115200);
- gpio_config();
- dma_config();
- adc_config();
- smg_config();
- Init_MAX7219();
- while(1)
- {
- at32_led_toggle(LED2);
- delay_sec(1);
- if(vmor_flag_index == 1)
- {
- vmor_flag_index = 0;
- w=33*adc1_ordinary_valuetab[1]/4095;
- Write_Max7219(1,w%10);
- Write_Max7219(2,10);
- Write_Max7219(3,w%100/10);
- Write_Max7219(4,15);
- Write_Max7219(5,adc1_ordinary_valuetab[1]%10);
- Write_Max7219(6,adc1_ordinary_valuetab[1]%100/10);
- Write_Max7219(7,adc1_ordinary_valuetab[1]%1000/100);
- Write_Max7219(8,adc1_ordinary_valuetab[1]/1000);
- }
- adc_ordinary_software_trigger_enable(ADC1, TRUE);
- }
- }
经程序的编译和下载,其运行的结果如图1至图3所示,其中左侧显示的是检测值,右侧显示的是电压值。由于数码管显示模块无法显示出小数点,故以横线来代替。 图1 检测3.3V电压
图2 检测GND电压
图3 悬空状态检测值
在此基础上,通过添加外挂的NTC温度检测模块,就实现温度的检测,所添加的功能处理程序为: - u=3300*adc1_ordinary_valuetab[1]/4095;
- if((u<=1644) && (u>1268))
- V=10+(1644-u)/37;
- if((u<=1268) && (u>947))
- V=20+(1268-u)/32;
- if((u<=947) && (u>692))
- V=30+(947-u)/25;
- Write_Max7219(1,V%10);
- Write_Max7219(2,V%100/10);
- Write_Max7219(3,15);
- Write_Max7219(4,15);
这样就可以将检测的温度在数码管上显示了,其检测效果如图4和图5所示。 图4 室温检测
图5 体温检测
因此看出,AT32L021的A/D检测功能还是很便于使用的。
|