打印
[活动专区]

【AT-START-L021测评】+NTC温度检测

[复制链接]
29|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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检测功能还是很便于使用的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

459

主题

2760

帖子

38

粉丝