|
在雅特力AT32F437上实现模拟ADC通道对芯片内部温度通道的采样。对其结果进行简单的中值滤波算法,以平滑采样结果。 本次实验以手动触发,阻塞式采样方式采集内置芯片温度。示例代码如下: - static void adc_temperature_config(void)
- {
- adc_common_config_type adc_common_struct;
- adc_base_config_type adc_base_struct;
- crm_periph_clock_enable(CRM_ADC1_PERIPH_CLOCK, TRUE);
- adc_common_default_para_init(&adc_common_struct);
- /* config combine mode */
- adc_common_struct.combine_mode = ADC_INDEPENDENT_MODE;
- /* config division,adcclk is division by hclk */
- adc_common_struct.div = ADC_HCLK_DIV_4;
- /* config common dma mode,it's not useful in independent mode */
- adc_common_struct.common_dma_mode = ADC_COMMON_DMAMODE_DISABLE;
- /* config common dma request repeat */
- adc_common_struct.common_dma_request_repeat_state = FALSE;
- /* config adjacent adc sampling interval,it's useful for ordinary shifting mode */
- adc_common_struct.sampling_interval = ADC_SAMPLING_INTERVAL_5CYCLES;
- /* config inner temperature sensor and vintrv */
- adc_common_struct.tempervintrv_state = TRUE;
- /* config voltage battery */
- adc_common_struct.vbat_state = FALSE;
- adc_common_config(&adc_common_struct);
- adc_base_default_para_init(&adc_base_struct);
- adc_base_struct.sequence_mode = FALSE;
- adc_base_struct.repeat_mode = FALSE;
- adc_base_struct.data_align = ADC_RIGHT_ALIGNMENT;
- adc_base_struct.ordinary_channel_length = 1;
- adc_base_config(ADC1, &adc_base_struct);
- adc_resolution_set(ADC1, ADC_RESOLUTION_12B);
- /* config ordinary channel */
- adc_ordinary_channel_set(ADC1, ADC_CHANNEL_16, 1, ADC_SAMPLETIME_640_5);
- /* adc enable */
- adc_enable(ADC1, TRUE);
- while (adc_flag_get(ADC1, ADC_RDY_FLAG) == RESET)
- ;
- /* adc calibration */
- adc_calibration_init(ADC1);
- while (adc_calibration_init_status_get(ADC1))
- ;
- adc_calibration_start(ADC1);
- while (adc_calibration_status_get(ADC1))
- ;
- }
- // main()
- while (1)
- {
- if (time_line_ms == 0)
- {
- time_line_ms = 200;
- adc_ordinary_software_trigger_enable(ADC1, TRUE);
- while (1)
- {
- adc_flag = adc_flag_get(ADC1, ADC_OCCE_FLAG);
- if (adc_flag == SET)
- {
- break;
- }
- }
- if (adc_seq >= 7)
- {
- temp_mcu = mid_filter(temp_buf, 7);
- adc_seq = 0;
- }
- temp_buf[adc_seq] = adc_ordinary_conversion_data_get(ADC1);
- adc_seq++;
- }
- }
实验效果还是不错的。我家的温度采样出来0x0625,用手指摸在MCU上面,数值上升还是蛮快。接下来就可以使用这个特性来做生成随机数的种子了。
|