[AT32F437] AT32F437内置温度模拟采样通道

[复制链接]
1728|2
抒情黎明 发表于 2025-9-27 10:12 | 显示全部楼层 |阅读模式
在雅特力AT32F437上实现模拟ADC通道对芯片内部温度通道的采样。对其结果进行简单的中值滤波算法,以平滑采样结果。
本次实验以手动触发,阻塞式采样方式采集内置芯片温度。示例代码如下:
  1. static void adc_temperature_config(void)
  2. {
  3.   adc_common_config_type adc_common_struct;
  4.   adc_base_config_type adc_base_struct;
  5.   crm_periph_clock_enable(CRM_ADC1_PERIPH_CLOCK, TRUE);
  6.   adc_common_default_para_init(&adc_common_struct);

  7.   /* config combine mode */
  8.   adc_common_struct.combine_mode = ADC_INDEPENDENT_MODE;

  9.   /* config division,adcclk is division by hclk */
  10.   adc_common_struct.div = ADC_HCLK_DIV_4;

  11.   /* config common dma mode,it's not useful in independent mode */
  12.   adc_common_struct.common_dma_mode = ADC_COMMON_DMAMODE_DISABLE;

  13.   /* config common dma request repeat */
  14.   adc_common_struct.common_dma_request_repeat_state = FALSE;

  15.   /* config adjacent adc sampling interval,it's useful for ordinary shifting mode */
  16.   adc_common_struct.sampling_interval = ADC_SAMPLING_INTERVAL_5CYCLES;

  17.   /* config inner temperature sensor and vintrv */
  18.   adc_common_struct.tempervintrv_state = TRUE;

  19.   /* config voltage battery */
  20.   adc_common_struct.vbat_state = FALSE;
  21.   adc_common_config(&adc_common_struct);

  22.   adc_base_default_para_init(&adc_base_struct);

  23.   adc_base_struct.sequence_mode = FALSE;
  24.   adc_base_struct.repeat_mode = FALSE;
  25.   adc_base_struct.data_align = ADC_RIGHT_ALIGNMENT;
  26.   adc_base_struct.ordinary_channel_length = 1;
  27.   adc_base_config(ADC1, &adc_base_struct);
  28.   adc_resolution_set(ADC1, ADC_RESOLUTION_12B);

  29.   /* config ordinary channel */
  30.   adc_ordinary_channel_set(ADC1, ADC_CHANNEL_16, 1, ADC_SAMPLETIME_640_5);

  31.   /* adc enable */
  32.   adc_enable(ADC1, TRUE);
  33.   while (adc_flag_get(ADC1, ADC_RDY_FLAG) == RESET)
  34.     ;

  35.   /* adc calibration */
  36.   adc_calibration_init(ADC1);
  37.   while (adc_calibration_init_status_get(ADC1))
  38.     ;
  39.   adc_calibration_start(ADC1);
  40.   while (adc_calibration_status_get(ADC1))
  41.     ;
  42. }

  43. // main()
  44.         while (1)
  45.   {
  46.     if (time_line_ms == 0)
  47.     {
  48.       time_line_ms = 200;
  49.       adc_ordinary_software_trigger_enable(ADC1, TRUE);
  50.       while (1)
  51.       {
  52.         adc_flag = adc_flag_get(ADC1, ADC_OCCE_FLAG);
  53.         if (adc_flag == SET)
  54.         {
  55.           break;
  56.         }
  57.       }
  58.       if (adc_seq >= 7)
  59.       {
  60.         temp_mcu = mid_filter(temp_buf, 7);
  61.         adc_seq = 0;
  62.       }
  63.       temp_buf[adc_seq] = adc_ordinary_conversion_data_get(ADC1);
  64.       adc_seq++;
  65.     }
  66.   }
实验效果还是不错的。我家的温度采样出来0x0625,用手指摸在MCU上面,数值上升还是蛮快。接下来就可以使用这个特性来做生成随机数的种子了。



观星者宁静 发表于 2025-9-29 20:19 | 显示全部楼层
还确实是啊!可以使用它来生成随机数种子
观星者宁静 发表于 2025-9-30 11:18 | 显示全部楼层
话说芯片内部的温度传感器主要是干啥呢?
太热了,告警之用?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

23

帖子

0

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