在AT32WB415片内配了1组2M采样速率12位A/D转换器,且有8个采集通道,通过相应的例程可供测试,其效果如图1所示。
图1 测试效果
在例程中,除了ADC的初始化处理,在使用中最为关注的则是函数adc_config (),其内容如下:
- static void adc_config(void)
- {
- adc_base_config_type adc_base_struct;
- crm_periph_clock_enable(CRM_ADC1_PERIPH_CLOCK, TRUE);
- crm_adc_clock_div_set(CRM_ADC_DIV_6);
- nvic_irq_enable(ADC1_IRQn, 0, 0);
- adc_base_default_para_init(&adc_base_struct);
- adc_base_struct.sequence_mode = TRUE;
- adc_base_struct.repeat_mode = FALSE;
- adc_base_struct.data_align = ADC_RIGHT_ALIGNMENT;
- adc_base_struct.ordinary_channel_length = 2;
- adc_base_config(ADC1, &adc_base_struct);
- adc_ordinary_channel_set(ADC1, ADC_CHANNEL_0, 1, ADC_SAMPLETIME_239_5);
- adc_ordinary_channel_set(ADC1, ADC_CHANNEL_1, 2, ADC_SAMPLETIME_239_5);
- adc_ordinary_conversion_trigger_set(ADC1, ADC12_ORDINARY_TRIG_SOFTWARE, TRUE);
- adc_dma_mode_enable(ADC1, TRUE);
- adc_voltage_monitor_enable(ADC1, ADC_VMONITOR_SINGLE_ORDINARY);
- adc_voltage_monitor_threshold_value_set(ADC1, 0xBBB, 0xAAA);
- adc_voltage_monitor_single_channel_select(ADC1, ADC_CHANNEL_1);
- adc_interrupt_enable(ADC1, ADC_VMOR_INT, TRUE);
- adc_enable(ADC1, TRUE);
- adc_calibration_init(ADC1);
- while(adc_calibration_init_status_get(ADC1));
- adc_calibration_start(ADC1);
- while(adc_calibration_status_get(ADC1));
- }
因此可知,它配置了2个数据采集通道,即ADC0和ADC1。而实际使用的只是ADC1,即使用PA1来采集外部的模拟信号。
为实现检测数据的波形绘制功能,在TFT屏显示程序的基础上,略加修改即可实现图2和图3所示的运行效果。
值得指出的是,由于PA0和PA1被ADC所占用,故原TFT屏所使用的引脚改为PC0和PC1。
电位器被接到PA1上,见图3所示。
受屏幕尺寸的限制,数据波形被限定在指定的窗口内,其范围是(20, 120)~(220, 260)之内。每个数据的间隔为4个像素点,绘制曲线的比例1/30。
图2 VDD电压检测
图3 电位器调节曲线
实现波形曲线绘制功能的主程序为:
- int main(void)
- {
- __IO uint32_t index = 0;
- uint16_t u= 0,x,y,yp;
- nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
- system_clock_config();
- gpio_config();
- dma_config();
- adc_config();
- app_tft_init();
- tft_Init();
- LCD_Clear(RED);
- LCD_Fill(0,0,239,50,WHITE);
- show_tb(60,0,0);
- delay_ms(1000);
- BACK_COLOR=WHITE;
- POINT_COLOR=RED;
- LCD_ShowChar(80,16,'A',1);
- LCD_ShowChar(90,16,'D',1);
- LCD_ShowChar(100,16,'C',1);
- LCD_Fill(0,287,239,319,WHITE);
- BACK_COLOR=WHITE;
- POINT_COLOR=RED;
- LCD_ShowString(60,294,"BY: jinglixixi");
- BACK_COLOR=RED;
- POINT_COLOR=YELLOW;
- LCD_ShowString(40,70,"ADC=");
- LCD_ShowString(40,90,"U= . V");
- LCD_DrawRectangle(20, 120, 220, 260);
- x=20;
- y=260;
- while(1)
- {
- delay_sec(1);
- if(vmor_flag_index == 1)
- {
- vmor_flag_index = 0;
- u=adc1_ordinary_valuetab[1];
- LCD_Show2Num(80,70,u,4);
- u=3.3*u/4.095;
- LCD_Show2Num(80,90,u/1000,1);
- LCD_Show2Num(96,90,u%1000,3);
- yp=260-u/30;
- LCD_DrawLine(x, y, x+4, yp);
- y=yp;
- x=x+4;
- if(x>210)
- {
- x=20;
- y=260;
- LCD_Fill(21,121,219,259,RED);
- }
- }
- adc_ordinary_software_trigger_enable(ADC1, TRUE);
- }
- }