1356|5

6

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

芯海传感器信号调理CDS8712开发板 ADC测试 [复制链接]

 

 

元旦前收到版主提供的资料,对照例程先测试了下ADC采集。计划配置为单端采集,如上图接入一滑动电阻器。

调试口的RST没有连接,芯片RST是高电平复位,调试器输出的复位是低电平。

上电按例程先执行  void fw_system_init(void) ,把其中的看门狗关闭了,一些不相关的也屏蔽了。

void fw_system_init(void)
{
    uint8_t count;

    hal_gpio_init();
#if LINK_DEBUG_ENABLE 
    ////hal_wdt_init();
#endif
    hal_timer_delay_init();
    hal_timer_delay_ms(3000);
#if DEBUG_PRINT_EN
    hal_uart_init();
    fw_debug_init();
#else
    hal_iic_init();
    fw_reg_init();
#endif
    
    hal_storage_init();
    fw_pmu_init();
#if 0
    fw_sample_tk_init();
    fw_sample_init();
#else
    fw_sample_init_all();
#endif
//  hal_temperature_init();
//  fw_notify_init();

    ft_config_init();

//  fw_system_temperature = hal_get_temprature();       // 温度初始化
//  fw_reg_set_temperature(fw_system_temperature);      // 上传温度值

    for(count = 0; count < 5; count++)  // 激活采样
    {
      //  fw_sample_proc();
    }
}

然后执行void hal_afe_init(void),原例程配置的是PB4,PB5,这里没有启用

注意void hal_afe_init(void)里调用的 hal_afe_sample_param_init();  在这里配置通道属性

开启了 afe2_pga_bypass_set,采集数据会稳定些

void hal_afe_init(void)                                         // AFE模块初始化,包含通道DAC校正
{
    static uint8_t valid;
    gpio_config_t gpio_config;
    nvic_config_t ptr_config;
    uint32_t i;

    for(i = 0; i < CH_NUM; i++)
    {
        ////gpio_mf_config(GPIO_GROUP_A, GPIO_PIN_NUM0,GPIO_MUX_FUNC_1);            //VS0
        // 采样通道的IO配置
////        if((g_ainn_channel == AFE2_AINN_SOURCE_FT10) || (g_ainp_channel == AFE2_AINP_SOURCE_FT10 )){
////            
////            gpio_mf_config(GPIO_GROUP_B, GPIO_PIN_NUM4, GPIO_MUX_FUNC_3);
////            gpio_mf_config(GPIO_GROUP_B, GPIO_PIN_NUM5, GPIO_MUX_FUNC_5);            
////            gpio_config.mode = GPIO_MODE_AN;
////            gpio_config.pin = GPIO_PIN_4;
////            gpio_config.pull = GPIO_PULL_NO_PULL;
////            gpio_init(GPIO_GROUP_B,&gpio_config);
////        }
////        if((g_ainn_channel == AFE2_AINN_SOURCE_FT11) || (g_ainp_channel == AFE2_AINP_SOURCE_FT11 )){
////            gpio_mf_config(GPIO_GROUP_B, GPIO_PIN_NUM5, GPIO_MUX_FUNC_5);
////            gpio_config.mode = GPIO_MODE_AN;
////            gpio_config.pin = GPIO_PIN_5;
////            gpio_config.pull = GPIO_PULL_NO_PULL;
////            gpio_init(GPIO_GROUP_B,&gpio_config);            
////        }

            
    }
    syscfg_regwrprot_disable();
    rcc_hirc_adc_enable_ctrl(ENABLE);                                           // 使能内部 24Mhz 高速振荡器
    syscfg_regwrprot_enable();
    rcc_apb_periph_clock_enable_ctrl(RCC_APBPeriph_AFE2, ENABLE);               // AFE ADC 时钟使能控制

    afe2_vs_voltage_set(HAL_AFE_VS);                                            //VS level  28.V
    hal_afe_sample_param_init();    
    afe2_vs_limit_enable_ctrl(ENABLE);
//  afe2_vs_output_enable_ctrl(ENABLE);             // VS_SEL(由硬件控制VS0输出开启或关闭,只在转换FT通道时开启)
    afe2_vs_enable_ctrl(ENABLE);                    // VS_EN
    hal_timer_delay_ms(6);
    afe2_vs_limit_enable_ctrl(DISABLE);
    hal_timer_delay_ms(1);
    do
    {
        valid = afe_adc_calibration();                // adc calibration
    }while(valid == 0);
#if HAL_AFE_INT_ENBALE                                                          // 选择是否使能AFE采样完成中断  
    ptr_config.nvic_channel_priority = 1;
    ptr_config.nvic_enable_flag = ENABLE;
    ptr_config.nvic_IRQ_channel = IRQn_AFE2;
    nvic_init(&ptr_config);
    afe2_adc_interrupt_enable_ctrl(ENABLE);
#else
    afe_adc_interrupt_disable();
#endif       
    for(i = 0; i < CH_NUM; i++){                    // 采样的通道配置
        afe2_pga_bypass_set(g_afe_channel,AFE2_PGA_BYPASS_ENABLE);   // default config AA bypass
    }                                               

    afe2_vs_enable_ctrl(DISABLE);
}

 

hal_afe_sample_param_init();  在这里配置通道属性

afe2_adc_channel_config(g_afe_channel, g_ainp_channel, AFE2_AINN_SOURCE_GND); 把通道配置为单端采集

CH_NUM宏定义里改成了4,对应开发板上AIN0~AIN3

static void hal_afe_sample_param_init()
{
    uint8_t i;

    afe2_config_t p_afe_config;
    for(i = 0; i < CH_NUM; i++)                                  // 采样的通道配置
    {
        ////afe2_adc_channel_config(g_afe_channel, g_ainp_channel, g_ainn_channel);
            afe2_adc_channel_config(g_afe_channel, g_ainp_channel, AFE2_AINN_SOURCE_GND);
        //    afe2_adc_channel_config(AFE2_AIN_Channel_1,AFE2_AINP_SOURCE_FT0, AFE2_AINN_SOURCE_GND);
            
    }
    p_afe_config.data_format = 0;
    p_afe_config.sample_time = AFE2_SAMPLE_TIME_8Cycles;
    p_afe_config.average_num = AFE2_AVERAGE_NUM_16;                 //16次有效转换周期
    p_afe_config.stop_mode = 0;
    p_afe_config.setup_time_int = AFE2_SETUP_TIME_240Cycles;    //20us建立时间
    p_afe_config.average_mode = AFE2_AVERAGE_MODE_TRIM;
    p_afe_config.conv_mode = AFE2_CONV_MODE_SINGLE_SCAN;//AFE2_CONV_MODE_LIMITED_SCAN;  //有限周期扫描
    p_afe_config.power_mode = AFE2_POWER_MODE_LP;
    afe2_init(&p_afe_config);

    for(i = 0; i < CH_NUM; i++)                                  // 采样的通道配置
    {
        afe2_pga_gain_set(g_afe_channel,HAL_AFE_PGA1_GAIN );
    }
    afe2_pga_enable_ctrl(ENABLE);
}

最后循环调用void hal_afe_sample(void) 

在hal_afe_rawdata中查看采集的ADC原值

void hal_afe_sample(void)                                       // 启动AFE采样
{
    char i;
    int16_t adc_value;

    hal_afe_flag_adc_overflow = 0;
    hal_afe_enable(HAL_AFE_NUM);                                // 开启AFE设置
    for(i = 0; i < CH_NUM; i++)                                 // 依次采样使能的通道
    {
        hal_afe_sample_chx(HAL_AFE_NUM, i);
        adc_value = hal_afe_data_get(HAL_AFE_NUM, i);
        hal_afe_rawdata = adc_value + s_adc_accumulate;   // 计算增加累加量修正的采样值
    }
////    hal_afe_disable(HAL_AFE_NUM);                               // 关闭AFE设置
}

滑动电位器,hal_afe_rawdata[0]的数值大致从6000变化到16000,跳幅大致在4个数值

 

 

例程里除了HAL库实现,还有另一种实现,采集通道是AIN0

下例中Action1里是初始化配置,Action2是采集(跑了个状态机)

 

VS_VOID Action1 (VS_VOID)
{
        static unsigned int aa=0;
    /*延时函数初始化,调用后可使用延时函数*/
    delay_init();
    afe2_config_t afe2_initStruct;
    nvic_config_t nvic_config; 

    /*PA0复用为VS */
    gpio_mf_config(GPIO_GROUP_A,GPIO_PIN_NUM0,GPIO_MUX_FUNC_1);

    rcc_apb_periph_clock_enable_ctrl(RCC_APBPeriph_AFE2,ENABLE);

    /*24MHz内部高速时钟源2分频作为ADC时钟模块*/
    rcc_clkout_config(RCC_MCU_CLKOUT_HIRC24_12,RCC_CLKOUT_PDIV_1);        //使能内部12Mhz 高速振荡器

    /*使能AFE采样完成中断 */
    nvic_config.nvic_channel_priority = 0x00;
    nvic_config.nvic_enable_flag = ENABLE;
    nvic_config.nvic_IRQ_channel = IRQn_AFE2;
    nvic_init(&nvic_config);
    /*ADC中断使能 */
    afe2_adc_interrupt_enable_ctrl(ENABLE);
    
    /*ADC采样通道选择通道*/
    afe2_adc_channel_config(g_afe_channel[0],AFE2_AINP_SOURCE_FT1,AFE2_AINN_SOURCE_GND);
    /*ADC采样通道使能*/
    afe2_adc_channel_enable_ctrl(g_afe_channel[0],ENABLE);
    /*设置为有限周期扫描模式 */
    afe2_initStruct.conv_mode               = AFE2_CONV_MODE_SINGLE_SCAN;
    /*格式为无符号数*/
    afe2_initStruct.data_format             = AFE2_DATA_FORMAT_UNSIGNED;
    /*有效转换周期次数128*/
    afe2_initStruct.average_num             = AFE2_AVERAGE_NUM_128;
    /*通道采样计数器129 ADC时钟*/
    afe2_initStruct.sample_time             = AFE2_SAMPLE_TIME_128Cycles;;
    /*AFE转换结束,置起中断*/
    afe2_initStruct.stop_mode               = AFE2_STOP_MODE_INTERRUPT;
    /*ADC通道建立时间选择80us*/
    afe2_initStruct.setup_time_int          = AFE2_SETUP_TIME_120Cycles;
    /*去掉最大值和最小值进行平均处理*/
    afe2_initStruct.average_mode            = AFE2_AVERAGE_MODE_TRIM;
    /*全速模式*/
    afe2_initStruct.power_mode              = AFE2_POWER_MODE_FS;
    /*ADC初始化*/
    afe2_init(&afe2_initStruct);
    /*PGA选择*/
    afe2_pga_gain_set(g_afe_channel[0],AFE2_PGA_GAIN_1);
    /*不使能PGA*/
    afe2_pga_enable_ctrl(ENABLE);////
    /*PGA1、PGA2均bypass*/
    afe2_pga_bypass_set(g_afe_channel[0],AFE2_PGA_BYPASS_DISBALE);////
    /*VS0配置2.6V*/
    afe2_vs_voltage_set(AFE2_VS_VOLTS_2V6);
    /*VS工作在正常模式*/
    afe2_vs_limit_enable_ctrl(DISABLE);
    delay_us(50);
    /*使能VS*/
    afe2_vs_enable_ctrl(ENABLE);
    delay_us(50);
    /*使能ADC*/
    afe2_adc_enable_ctrl(ENABLE);    
    delay_us(20);
    /*使能ADC校准*/
    ////afe2_adc_calibration_start();
    /*等待ADC校准完成*/
   //// while(!afe2_flag_status_get(AFE2_FLAG_CALF));
    /*关闭ADC校准*/
   //// afe2_adc_calibration_stop();
    delay_us(50);
    /*关闭ADC*/
    afe2_adc_enable_ctrl(DISABLE);  
    /*关闭VS */
    afe2_vs_enable_ctrl(DISABLE);    

}


VS_VOID Action2 (VS_VOID)
{
    static unsigned int aa;
  int ret;
    
    aa++;
    
       /*VS使能 */
    afe2_vs_enable_ctrl(ENABLE);
    /*PGA使能 */
    afe2_pga_enable_ctrl(ENABLE);
    /*ADC使能 */
    afe2_adc_enable_ctrl(ENABLE);
        
    /*设置采样通道 */
    afe2_adc_channel_enable_ctrl(g_afe_channel[0],ENABLE);
    /*启动采样 */
    afe2_adc_conversion_start();                                         

    /*进入普通睡眠模式*/
    pwr_sleep_mode_enter(PWR_SLEEP_MODE_NORMAL,PWR_SLEEP_ENTRY_WFI);

    /*等待采样完成,AFE0_Finish只在中断中置位 */
    while(AFE0_Finish == 0);
    /*清除采样完成标志位 */
    AFE0_Finish = 0;
    /*读采样值 */
    afe_rawdata[0] = afe2_adc_conversion_value_get(g_afe_channel[0]);
   
    /*关闭PGA */
//    afe2_vs_enable_ctrl(DISABLE);
    /*关闭ADC*/
 //   afe2_adc_enable_ctrl(DISABLE);  
    /*关闭VS */
 //   afe2_vs_enable_ctrl(DISABLE); 
        
        
        
        /*ADC采样数据有效标志获取*/
        ret = afe2_adc_result_valid_flag_get(g_afe_channel[0]);
        /*采样的ADC码值*/
        if(ret == 1)
        {
            SensorADC = afe_rawdata[0];
            //printf("tempSensorADC : %d,%x\r\n ",ret,SensorADC);
        }
        /*延迟200ms*/
        delay_ms(500);        
    SEQ_AddEvent(Event1);
}
 

 

最新回复

您好,我用的官方例程,但是一直读出的是基准电压,滑动变阻器数值不变,我和您一样的代码,我有一个问题num=4,为什么g_afe_channel不是配置四个通道。  详情 回复 发表于 2024-11-14 10:29
点赞 关注
 
 

回复
举报

1510

帖子

1

TA的资源

五彩晶圆(初级)

沙发
 

用J-LINK为开发板供电的电压是几伏?

 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

3.3V,官方的例子直接就能跑通printf


点评

好,谢谢!!!  详情 回复 发表于 2024-1-21 16:08
 
 
 

回复

1510

帖子

1

TA的资源

五彩晶圆(初级)

4
 
bcqat89m 发表于 2024-1-12 19:10 3.3V,官方的例子直接就能跑通printf

好,谢谢!!!

 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 

楼主你好,我用官方例程去adc读取内部温度传感信号,程序一直卡在检查校准标志位那,请问你有碰到过这种情况吗

 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

6
 
您好,我用的官方例程,但是一直读出的是基准电压,滑动变阻器数值不变,我和您一样的代码,我有一个问题num=4,为什么g_afe_channel不是配置四个通道。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
dsp论文系列

现在越来越火爆的,比起单片机来,功能是强大不少,看看现在都研究些什么?不过主要是关注电机控制这一块,其他的了解不是很多, ...

快快乐乐跟我学开关电源设计

转自ourdev,非常好的学习指导,推荐给大家。 “我想DIY开关电源,要具备哪些理论知识、实践技能和工程素质啊?&rdquo ...

自制廉价的GPS外接天线

有网友试过,效果确实不错:宿舍窗台上(11楼)不到20秒,显示了时间,再过几秒,就显示了经纬度,没调,就收到4颗心!! 材 ...

一张图让你明白共模电压 (VCM) 与输出电压 (VOUT)的关系

工程师们几十年来一直在努力理解神秘的共模电压 (VCM) 与输出电压 (VOUT) 比较图。尽管 VCM 与 VOUT 形状经常会因器件及设置配置 ...

CAN IAP实例

此内容由EEWORLD论坛网友雪山飞狐11原创,如需转载或用于商业用途需征得作者同意并注明出处 CAN IAP botloader,在我 ...

C6000系列DSP的GPIO框图

首先看一下GPIO的框图: 474214 通过查看GPIO框图,我们可以得出许多信息: DIR寄存器控制GPIO管脚是输入还是输出,其 ...

[EETALk]作为一名蓝牙工程师,需要掌握哪些知识?

作为一个蓝牙工程师,一般的工作职能是什么呢??? 又需要掌握哪些知识呢??? 坛子里有蓝牙工程师吗? 又或者从事蓝 ...

【STM32U599J-DK】添加自定义驱动文件夹

本帖最后由 lugl4313820 于 2023-12-11 09:45 编辑 【前言】 在touchgfx4.22在生成的工程中,用stm32CubeIde编译下载到开 ...

雷达信号处理和数据处理技术

本书可以帮助雷达工程技术人员和雷达使用人员掌握有关雷达信号处理和数据处理技术,解决有关应用问题;同时还可以作为高等学校电 ...

百问MQTT协议分析 - 报文分析①

## 16.3 报文分析 ### 16.3.1 CONNECT-连接服务端 ​ 客户端到服务端的网络连接建立(完成三次握手)后,客户端发 ...

关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表