hujj 发表于 2021-1-30 17:32

【GD32E503评测】 ADC实验(续)

<p>&nbsp; &nbsp; 测试过了内部温度及参考电压的ADC转换之后,随后便开始板上的ADC测试,厂家提供的与ADC有关的示例共用四个,第一个就是内部温度与参考电压的测试,另外三个分别是跟进模式、规则并行模式和通道差动模式(参见下图):</p>

<p></p>

<p>&nbsp; &nbsp; 我分别编译下载了上述三个模式的示例,但在运行示例代码时,无论怎样调整ADC测试的电位器,数值都不会相应变动(参见下图):</p>

<p></p>

<p>&nbsp; &nbsp; 下图为通道差动模式读取的数据:</p>

<p></p>

<p>&nbsp;</p>

<p>&nbsp; &nbsp; &nbsp; 查看代码,三个示例中ADC启用的通道引脚均为PC2和PC3,而非电路图中给出的PA1和PA2引脚。下图为GPIO配置的代码截图:</p>

<p></p>

<p>&nbsp; &nbsp; 下图标注ADC1(连接电位器)是连接在PA1引脚上,可以外接输入(或连接DAC)是连接在PA2引脚上:</p>

<p></p>

<p>&nbsp; &nbsp;我尝试在参考示例代码,在通过串口发送ADC转换数值的同时,在屏幕上显示出数值并通过图形显示出数值变化,由于ADC转换值仅有微小的变化,图形显示不直观(参见下图):</p>

<p></p>

<p>&nbsp; &nbsp; 我尝试通过修改代码来启用板上的ADC1和ADC2,先分析了ADC配置的相关函数(参见下图):</p>

<p></p>

<p>&nbsp;</p>

<p>&nbsp; &nbsp; 首先将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>&nbsp;</p>

<p>&nbsp; &nbsp; 同时打开了相应的时钟:</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>&nbsp;</p>

<p>&nbsp; &nbsp; 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>&nbsp;</p>

<p>&nbsp; &nbsp; 通过上述修改,编译烧录测试,通道1的ADC数值可以跟随电位器调节而变化了,至此,板上的ADC测试得到了成功,下图为测试的照片,屏幕中间靠右边的两组数据分别是ADC1和ADC2的值,ADC1的值随着电位器的旋转而变化,ADC2未连接,所以数值基本不变。</p>

<p></p>

<p>&nbsp; &nbsp; 下图为串口调试助手获得的数据:</p>

<p></p>

hujj 发表于 2021-1-30 17:36

<p>&nbsp; &nbsp; 这是测试代码的压缩包,由于反复测试,有很多注释的代码尚未删除,因此代码有点杂乱。</p>

<p></p>

superstar_gu 发表于 2021-2-4 16:33

<p>解析代码确实很耗时间</p>

zxopenljx 发表于 2021-3-29 16:09

<p>谢谢分享</p>

tage008 发表于 2021-7-18 17:56

<p>感谢分享</p>
页: [1]
查看完整版本: 【GD32E503评测】 ADC实验(续)