[活动专区] 【AT-START-L021测评】+NTC温度检测

[复制链接]
 楼主| jinglixixi 发表于 2024-11-27 19:11 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2024-11-27 19:14 编辑

AT32L021内置了12位的模拟/数字转换器,可通过多达15个外部通道和3个内部通道,并可配置在12/10/8/6位分辨率下采样。
在对通道5进行采集的情况下,通过PA5来输入模拟信号就可完成检测的任务。
为了能直观地观察到检测的结果,就将下面介绍的数码管显示模块与其配合工作,此时数码管所连接的引脚关系为:
CLK---PB8
DIN---PB9
CS---PA7

对所用引脚的功能配置函数为:
  1. void smg_config(void)
  2. {
  3.   gpio_init_type gpio_init_struct;
  4.   crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  5.   gpio_default_para_init(&gpio_init_struct);        
  6.   gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  7.   gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  8.   gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
  9.   gpio_init_struct.gpio_pins = GPIO_PINS_7;
  10.   gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  11.   gpio_init(GPIOA, &gpio_init_struct);        
  12.   crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
  13.   gpio_init_struct.gpio_pins = GPIO_PINS_8|GPIO_PINS_9;
  14.   gpio_init(GPIOB, &gpio_init_struct);
  15. }

实现电压检测的主程序为:
  1. int main(void)
  2. {
  3.   __IO uint32_t index = 0;
  4.   __IO uint8_t w = 0;
  5.   __IO uint32_t u,V;
  6.   system_clock_config();
  7.   at32_board_init();
  8.   at32_led_off(LED2);
  9.   at32_led_off(LED3);
  10.   at32_led_off(LED4);
  11.   uart_print_init(115200);
  12.   gpio_config();
  13.   dma_config();
  14.   adc_config();
  15.   smg_config();
  16.   Init_MAX7219();
  17.   while(1)
  18.   {
  19.     at32_led_toggle(LED2);
  20.     delay_sec(1);
  21.     if(vmor_flag_index == 1)
  22.     {
  23.           vmor_flag_index = 0;
  24.           w=33*adc1_ordinary_valuetab[1]/4095;
  25.           Write_Max7219(1,w%10);  
  26.           Write_Max7219(2,10);
  27.           Write_Max7219(3,w%100/10);
  28.           Write_Max7219(4,15);
  29.           Write_Max7219(5,adc1_ordinary_valuetab[1]%10);
  30.           Write_Max7219(6,adc1_ordinary_valuetab[1]%100/10);
  31.           Write_Max7219(7,adc1_ordinary_valuetab[1]%1000/100);
  32.           Write_Max7219(8,adc1_ordinary_valuetab[1]/1000);
  33.     }
  34.     adc_ordinary_software_trigger_enable(ADC1, TRUE);
  35.   }
  36. }

经程序的编译和下载,其运行的结果如图1至图3所示,其中左侧显示的是检测值,右侧显示的是电压值。由于数码管显示模块无法显示出小数点,故以横线来代替。
940936746fdd7c8dbe.png
1 检测3.3V电压

892586746fded5b054.png
2 检测GND电压

112596746fe01cb782.png
3 悬空状态检测值

在此基础上,通过添加外挂的NTC温度检测模块,就实现温度的检测,所添加的功能处理程序为:
  1.       u=3300*adc1_ordinary_valuetab[1]/4095;
  2.       if((u<=1644) && (u>1268))
  3.          V=10+(1644-u)/37;
  4.       if((u<=1268) && (u>947))
  5.          V=20+(1268-u)/32;
  6.       if((u<=947) && (u>692))
  7.          V=30+(947-u)/25;
  8.       Write_Max7219(1,V%10);
  9.       Write_Max7219(2,V%100/10);
  10.       Write_Max7219(3,15);                        
  11.       Write_Max7219(4,15);

这样就可以将检测的温度在数码管上显示了,其检测效果如图4和图5所示。
269846746fe42a5ee6.png
4 室温检测

718606746fe571f5b1.png
5 体温检测


因此看出,AT32L021的A/D检测功能还是很便于使用的。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

518

主题

2934

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部