测试过了内部温度及参考电压的ADC转换之后,随后便开始板上的ADC测试,厂家提供的与ADC有关的示例共用四个,第一个就是内部温度与参考电压的测试,另外三个分别是跟进模式、规则并行模式和通道差动模式(参见下图):
我分别编译下载了上述三个模式的示例,但在运行示例代码时,无论怎样调整ADC测试的电位器,数值都不会相应变动(参见下图):
下图为通道差动模式读取的数据:
查看代码,三个示例中ADC启用的通道引脚均为PC2和PC3,而非电路图中给出的PA1和PA2引脚。下图为GPIO配置的代码截图:
下图标注ADC1(连接电位器)是连接在PA1引脚上,可以外接输入(或连接DAC)是连接在PA2引脚上:
我尝试在参考示例代码,在通过串口发送ADC转换数值的同时,在屏幕上显示出数值并通过图形显示出数值变化,由于ADC转换值仅有微小的变化,图形显示不直观(参见下图):
我尝试通过修改代码来启用板上的ADC1和ADC2,先分析了ADC配置的相关函数(参见下图):
首先将GPIO配置修改为PA1和PA2:
- void gpio_config(void)
- {
-
-
- gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_MAX, GPIO_PIN_1|GPIO_PIN_2);
- }
同时打开了相应的时钟:
- void rcu_config(void)
- {
-
-
- rcu_periph_clock_enable(RCU_GPIOC|RCU_GPIOA);
-
- rcu_periph_clock_enable(RCU_ADC0);
-
- rcu_periph_clock_enable(RCU_ADC1);
-
- rcu_periph_clock_enable(RCU_DMA0);
-
- rcu_periph_clock_enable(RCU_TIMER1);
-
- rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV6);
-
- }
ADC的配置修改如下:
- void adc_config(void)
- {
-
- adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);
- adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, DISABLE);
-
-
-
- adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);
-
-
- adc_mode_config(ADC_DAUL_REGULAL_FOLLOWUP_FAST);
-
-
- adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 2);
-
-
- adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_1, ADC_SAMPLETIME_55POINT5);
- adc_regular_channel_config(ADC0, 1, ADC_CHANNEL_2, ADC_SAMPLETIME_55POINT5);
-
-
-
-
-
- adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_EXTTRIG_REGULAR_T1_CH1);
-
-
- adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);
-
-
-
- adc_enable(ADC0);
- delay_1ms(1);
-
- adc_calibration_enable(ADC0);
-
-
-
-
-
-
-
- adc_dma_mode_enable(ADC0);
-
- }
-
通过上述修改,编译烧录测试,通道1的ADC数值可以跟随电位器调节而变化了,至此,板上的ADC测试得到了成功,下图为测试的照片,屏幕中间靠右边的两组数据分别是ADC1和ADC2的值,ADC1的值随着电位器的旋转而变化,ADC2未连接,所以数值基本不变。
下图为串口调试助手获得的数据:
|