【GD32E503评测】 ADC实验(续)
<p> 测试过了内部温度及参考电压的ADC转换之后,随后便开始板上的ADC测试,厂家提供的与ADC有关的示例共用四个,第一个就是内部温度与参考电压的测试,另外三个分别是跟进模式、规则并行模式和通道差动模式(参见下图):</p><p></p>
<p> 我分别编译下载了上述三个模式的示例,但在运行示例代码时,无论怎样调整ADC测试的电位器,数值都不会相应变动(参见下图):</p>
<p></p>
<p> 下图为通道差动模式读取的数据:</p>
<p></p>
<p> </p>
<p> 查看代码,三个示例中ADC启用的通道引脚均为PC2和PC3,而非电路图中给出的PA1和PA2引脚。下图为GPIO配置的代码截图:</p>
<p></p>
<p> 下图标注ADC1(连接电位器)是连接在PA1引脚上,可以外接输入(或连接DAC)是连接在PA2引脚上:</p>
<p></p>
<p> 我尝试在参考示例代码,在通过串口发送ADC转换数值的同时,在屏幕上显示出数值并通过图形显示出数值变化,由于ADC转换值仅有微小的变化,图形显示不直观(参见下图):</p>
<p></p>
<p> 我尝试通过修改代码来启用板上的ADC1和ADC2,先分析了ADC配置的相关函数(参见下图):</p>
<p></p>
<p> </p>
<p> 首先将GPIO配置修改为PA1和PA2:</p>
<pre>
<code class="language-cs">void gpio_config(void)
{
/* configure the GPIO as analog mode */
// gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_MAX, GPIO_PIN_2|GPIO_PIN_3);
gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_MAX, GPIO_PIN_1|GPIO_PIN_2);
}</code></pre>
<p> </p>
<p> 同时打开了相应的时钟:</p>
<pre>
<code class="language-cs">void rcu_config(void)
{
/* enable GPIO clock */
rcu_periph_clock_enable(RCU_GPIOC|RCU_GPIOA);
/* enable ADC0 clock */
rcu_periph_clock_enable(RCU_ADC0);
/* enable ADC1 clock */
rcu_periph_clock_enable(RCU_ADC1);
/* enable DMA0 clock */
rcu_periph_clock_enable(RCU_DMA0);
/* enable TIMER1 clock */
rcu_periph_clock_enable(RCU_TIMER1);
/* configure ADC clock */
rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV6);
// rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV12);
}</code></pre>
<p> </p>
<p> ADC的配置修改如下:</p>
<pre>
<code class="language-cs">void adc_config(void)
{
/* enable ADC continous function 启用ADC连续功能 */
adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);
adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, DISABLE);
// adc_special_function_config(ADC1, ADC_SCAN_MODE, ENABLE);
// adc_special_function_config(ADC1, ADC_CONTINUOUS_MODE, DISABLE);
/* configure ADC data alignment 配置ADC数据对齐 */
adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);
// adc_data_alignment_config(ADC1, ADC_DATAALIGN_RIGHT);
/* configure ADC mode 配置ADC模式 */
adc_mode_config(ADC_DAUL_REGULAL_FOLLOWUP_FAST);
/* configure ADC channel length 配置ADC通道长度 */
adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 2);
// adc_channel_length_config(ADC1, ADC_REGULAR_CHANNEL, 2);
/* configure ADC regular channel 配置ADC常规通道 */
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_regular_channel_config(ADC0, 0, ADC_CHANNEL_12, ADC_SAMPLETIME_55POINT5);
// adc_regular_channel_config(ADC0, 1, ADC_CHANNEL_13, ADC_SAMPLETIME_55POINT5);
// adc_regular_channel_config(ADC1, 0, ADC_CHANNEL_13, ADC_SAMPLETIME_55POINT5);
// adc_regular_channel_config(ADC1, 1, ADC_CHANNEL_12, ADC_SAMPLETIME_55POINT5);
/* configure ADC trigger 配置ADC触发器 */
adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_EXTTRIG_REGULAR_T1_CH1);
// adc_external_trigger_source_config(ADC1, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);
/* enable ADC external trigger 启用ADC外部触发器 */
adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);
// adc_external_trigger_config(ADC1, ADC_REGULAR_CHANNEL, ENABLE);
/* enable ADC interface 启用ADC接口 */
adc_enable(ADC0);
delay_1ms(1);
/* ADC calibration and reset calibration ADC校准和复位校准 */
adc_calibration_enable(ADC0);
/* enable ADC interface 启用ADC接口 */
// adc_enable(ADC1);
// delay_1ms(1);
/* ADC calibration and reset calibration ADC校准和复位校准 */
// adc_calibration_enable(ADC1);
/* enable ADC DMA function 启用ADC DMA功能 */
adc_dma_mode_enable(ADC0);
}
</code></pre>
<p> </p>
<p> 通过上述修改,编译烧录测试,通道1的ADC数值可以跟随电位器调节而变化了,至此,板上的ADC测试得到了成功,下图为测试的照片,屏幕中间靠右边的两组数据分别是ADC1和ADC2的值,ADC1的值随着电位器的旋转而变化,ADC2未连接,所以数值基本不变。</p>
<p></p>
<p> 下图为串口调试助手获得的数据:</p>
<p></p>
<p> 这是测试代码的压缩包,由于反复测试,有很多注释的代码尚未删除,因此代码有点杂乱。</p>
<p></p>
<p>解析代码确实很耗时间</p>
<p>谢谢分享</p>
<p>感谢分享</p>
页:
[1]