|
ADC和DAC是两座沟通模拟世界与数字世界的桥梁。ADC是将模拟量转化为量化数字,以表征模拟量的幅值;DAC则是将数字量转化为电压的幅值输出。
根据AT32F437的数据手册,对于ADC1外设的通道4对应PA4(我发现PA0引脚被占用了)。在配置完成AT32的时钟树之后,我们让系统主频工作在288MHz,这样也使得ADC1外设的输入时钟源的频率也达到了288MHz。
在本次应用中,我的ADC1分频系数使用了16分之一,故ADC1的工作频率为18MHz。剩下的配置使用了AT32 WorkBench的默认值。
ADC1的PA4通道的配置初始化代码如下:
- /**
- * [url=/u/brief]@brief[/url] init adc-common function.
- * @param none
- * @retval none
- */
- void wk_adc_common_init(void)
- {
- adc_common_config_type adc_common_struct;
- adc_reset();
- /* adc_common_settings------------------------------------------------------------ */
- adc_common_default_para_init(&adc_common_struct);
- adc_common_struct.combine_mode = ADC_INDEPENDENT_MODE;
- adc_common_struct.div = ADC_HCLK_DIV_16;
- adc_common_struct.common_dma_mode = ADC_COMMON_DMAMODE_DISABLE;
- adc_common_struct.common_dma_request_repeat_state = FALSE;
- adc_common_struct.sampling_interval = ADC_SAMPLING_INTERVAL_5CYCLES;
- adc_common_struct.tempervintrv_state = FALSE;
- adc_common_struct.vbat_state = FALSE;
- adc_common_config(&adc_common_struct);
- }
- /**
- * @brief init adc1 function.
- * @param none
- * @retval none
- */
- void wk_adc1_init(void)
- {
- gpio_init_type gpio_init_struct;
- adc_base_config_type adc_base_struct;
- gpio_default_para_init(&gpio_init_struct);
- /*gpio--------------------------------------------------------------------*/
- /* configure the IN4 pin */
- gpio_init_struct.gpio_mode = GPIO_MODE_ANALOG;
- gpio_init_struct.gpio_pins = GPIO_PINS_4;
- gpio_init(GPIOA, &gpio_init_struct);
- /* adc_settings------------------------------------------------------------------- */
- 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);
- 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));
- }
此时我们完成了ADC1的时钟频率配置,PA4的GPIO模式配置,设置12bit的采样精度,并启动了自校准功能,再次等待ADC1就绪。之后,我们就可以触发ADC1的采样功能了。
- while(1)
- {
- if(tick == 0)
- {
- tick = 1000;
- adc_ordinary_software_trigger_enable(ADC1, TRUE);
- while(adc_flag_get(ADC1, ADC_OCCE_FLAG) == RESET);
- val = adc_ordinary_conversion_data_get(ADC1);
- dbg_printf("volt = %d\r\n", val);
- }
- }
整体应用下来感觉还是非常方便与顺利的。单从AT WorkBench软件的打开速度上来比就比国外的图形化软件要快,要快的多。
|