查看: 7632|回复: 1

[GD32F450测试]3、ADC采样实验

[复制链接]
  • TA的每日心情
    开心
    2019-11-19 11:07
  • 签到天数: 226 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2017-5-26 09:46:40 | 显示全部楼层 |阅读模式
    分享到:
    做ADC采样实验更能看出板卡的文档以及案例的不太宜人,无奈只好瞎试了,还在有点看文档的基础结果多册尝试总算解决了几个问题:
    A. ADC的输出口不是ADC0,是ADC1的几个通道,这是非常误人子弟的,因为几个案例中都设置为ADC0,因此无论如何得不到结果!
    B. 案例中没有如何得到ADC的采样结果的方法,只好穷搜,算是找到了,但还是没有找到如何开通多个通道获取多个通道的ADC采样指的方法。
    下边将ADC1的3通道采样实验罗列如下:
    首先定义ADC1的一些口参数:
    #define BOARD_ADC_CHANNEL1 ADC_CHANNEL_3
    #define ADC_GPIO_PORT GPIOA
    #define ADC_GPIO_PIN1 GPIO_PIN_3
    接着增加定义1个32位的val0变量:
    uint32_t val0,js;
    接着在ioInit函数中增加定义ADC口的语句:
    gpio_mode_set(ADC_GPIO_PORT,GPIO_MODE_ANALOG,GPIO_PUPD_NONE,(ADC_GPIO_PIN1|ADC_GPIO_PIN2));
    rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_ADC1);
    adc_clock_config(ADC_ADCCK_PCLK2_DIV4);
    增加1个函数初始化ADC:
    //configure the ADC peripheral
    void adcInit(void){
    //ADC channel length config
    adc_channel_length_config(ADC1,ADC_REGULAR_CHANNEL,2);
    //ADC regular channel config
    adc_regular_channel_config(ADC1,0,(BOARD_ADC_CHANNEL1|BOARD_ADC_CHANNEL2),ADC_SAMPLETIME_56);
    //ADC external trigger enable
    adc_external_trigger_config(ADC1,ADC_REGULAR_CHANNEL,EXTERNAL_TRIGGER_DISABLE);
    //ADC data alignment config
    adc_data_alignment_config(ADC1,ADC_DATAALIGN_RIGHT);
    adc_resolution_config(ADC1,ADC_RESOLUTION_12B);
    adc_oversample_mode_config(ADC1,ADC_OVERSAMPLING_ALL_CONVERT,ADC_OVERSAMPLING_SHIFT_NONE,ADC_OVERSAMPLING_SHIFT_NONE);
    adc_oversample_mode_disable(ADC1);
    adc_special_function_config(ADC1,ADC_SCAN_MODE,ENABLE);
    //enable ADC interface/
    adc_enable(ADC1);
    //ADC calibration and reset calibration/
    adc_calibration_enable(ADC1);
    }
    注意此函数定义了两个通道,但不知如何触发第2个通道和如何采样,因此只是摆设。下边以软触发打开测试ADC采样函数[12比特采样结果]:
    //ADC Test one
    void adcTest(void){
    //ADC resolusion 12B
    adc_enable(ADC1);
    adc_software_trigger_enable(ADC1,ADC_REGULAR_CHANNEL);
    while(RESET==adc_flag_get(ADC1,ADC_FLAG_EOC));
    delay_1ms(5);
    val0=ADC_RDATA(ADC1);
    adc_disable(ADC1);
    }
    这样主函数的循环中调用一次此函数,采样1次并获得结果1个。main主函数改为:
    int main(void){
    systick_config();
    ioInit();
    gd_eval_com_init(EVAL_COM1);
    adcInit();
    lcdInit();
    lcdClear();
    dispBase();
    while(1){
      js++;
      ledTest();
      adcTest();
      printf("JSQ=%d ADC0=%d \n\r",js,val0);
      dispMes();
      delaym(1000);
    }
    }
    最后增加显示基础的布局和测试结果的两个函数:
    //Display BaseData
    void dispBase(void){
    c2l(3,0,19);c2l(3,1,28);//JS
    c2l(2,0,10);c2l(2,1,0);//c2l(2,8,10);c2l(2,9,1);//A0 A1
    //c2l(1,0,25);c2l(1,1,32);c2l(1,2,22);c2l(1,8,25);c2l(1,9,32);c2l(1,10,22);//PWM PWM
    //c2l(0,0,25);c2l(0,1,21);c2l(0,2,29);c2l(0,3,40);c2l(0,9,28);//PLT:
    }
    //Display Test Data
    void dispMes(void){
    c2l(3,3,(js/100000)%10);c2l(3,4,(js/10000)%10);c2l(3,5,(js/1000)%10);c2l(3,6,(js/100)%10);c2l(3,7,(js/10)%10);c2l(3,8,(js)%10);
    c2l(2,3,(val0/1000)%10);c2l(2,4,(val0/100)%10);c2l(2,5,(val0/10)%10);c2l(2,6,(val0)%10);//c2l(2,7,(val0)%10);
    }
    编译下载后的结果串口数据见图31,硬件效果见照片32。注意这两个函数在最后,前边应该声明!

    31

    31

    32

    32
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2018-3-29 09:22
  • 签到天数: 15 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2017-6-16 22:02:10 | 显示全部楼层
    谢谢分享
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-11-24 09:40 , Processed in 0.124860 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.