bcqat89m 发表于 2024-1-4 20:45

芯海传感器信号调理CDS8712开发板 ADC测试

<div style="text-align: center;"></div>

<p>&nbsp;
<p><span style="color:#16a085;">元旦前收到版主提供的资料,对照例程先测试了下ADC采集。计划配置为单端采集,如上图接入一滑动电阻器。</span></p>
</p>

<p><span style="color:#16a085;">调试口的RST没有连接,芯片RST是高电平复位,调试器输出的复位是低电平。</span></p>

<p><span style="color:#16a085;">上电按例程先执行&nbsp; void fw_system_init(void) ,把其中的看门狗关闭了,一些不相关的也屏蔽了。</span></p>

<pre>
<code>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 &lt; 5; count++)// 激活采样
    {
      //fw_sample_proc();
    }
}</code></pre>

<p><span style="color:#16a085;">然后执行void hal_afe_init(void),原例程配置的是PB4,PB5,这里没有启用</span></p>

<p><span style="color:#16a085;">注意void hal_afe_init(void)里调用的 hal_afe_sample_param_init();&nbsp; 在这里配置通道属性</span></p>

<p><span style="color:#16a085;">开启了&nbsp;afe2_pga_bypass_set,采集数据会稳定些</span></p>

<pre>
<code>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 &lt; 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,&amp;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,&amp;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 level28.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(&amp;ptr_config);
    afe2_adc_interrupt_enable_ctrl(ENABLE);
#else
    afe_adc_interrupt_disable();
#endif      
    for(i = 0; i &lt; CH_NUM; i++){                  // 采样的通道配置
      afe2_pga_bypass_set(g_afe_channel,AFE2_PGA_BYPASS_ENABLE);   // default config AA bypass
    }                                             

    afe2_vs_enable_ctrl(DISABLE);
}</code></pre>

<p>&nbsp;</p>

<p><span style="color:#16a085;">hal_afe_sample_param_init();&nbsp; 在这里配置通道属性</span></p>

<p><span style="color:#16a085;">afe2_adc_channel_config(g_afe_channel, g_ainp_channel, AFE2_AINN_SOURCE_GND); 把通道配置为单端采集</span></p>

<p><span style="color:#16a085;">CH_NUM宏定义里改成了4,对应开发板上AIN0~AIN3</span></p>

<pre>
<code>static void hal_afe_sample_param_init()
{
    uint8_t i;

    afe2_config_t p_afe_config;
    for(i = 0; i &lt; 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(&amp;p_afe_config);

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

<p><span style="color:#16a085;">最后循环调用void hal_afe_sample(void)&nbsp;</span></p>

<p><span style="color:#16a085;">在hal_afe_rawdata中查看采集的ADC原值</span></p>

<pre>
<code>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 &lt; 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设置
}</code></pre>

<p><span style="color:#16a085;">滑动电位器,hal_afe_rawdata的数值大致从6000变化到16000,跳幅大致在4个数值</span></p>

<p>&nbsp;</p>

<div style="text-align: center;"></div>

<p>&nbsp;</p>

<p><span style="color:#1abc9c;">例程里除了HAL库实现,还有另一种实现,采集通道是AIN0</span></p>

<p><span style="color:#1abc9c;">下例中Action1里是初始化配置,Action2是采集(跑了个状态机)</span></p>

<div style="text-align: center;"></div>

<p>&nbsp;</p>

<pre>
<code>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(&amp;nvic_config);
    /*ADC中断使能 */
    afe2_adc_interrupt_enable_ctrl(ENABLE);
   
    /*ADC采样通道选择通道*/
    afe2_adc_channel_config(g_afe_channel,AFE2_AINP_SOURCE_FT1,AFE2_AINN_SOURCE_GND);
    /*ADC采样通道使能*/
    afe2_adc_channel_enable_ctrl(g_afe_channel,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(&amp;afe2_initStruct);
    /*PGA选择*/
    afe2_pga_gain_set(g_afe_channel,AFE2_PGA_GAIN_1);
    /*不使能PGA*/
    afe2_pga_enable_ctrl(ENABLE);////
    /*PGA1、PGA2均bypass*/
    afe2_pga_bypass_set(g_afe_channel,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,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 = afe2_adc_conversion_value_get(g_afe_channel);
   
    /*关闭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);
      /*采样的ADC码值*/
      if(ret == 1)
      {
            SensorADC = afe_rawdata;
            //printf("tempSensorADC : %d,%x\r\n ",ret,SensorADC);
      }
      /*延迟200ms*/
      delay_ms(500);      
    SEQ_AddEvent(Event1);
}
</code></pre>

<p>&nbsp;</p>

jinglixixi 发表于 2024-1-11 13:03

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

bcqat89m 发表于 2024-1-12 19:10

<p>3.3V,官方的例子直接就能跑通printf</p><br/>

jinglixixi 发表于 2024-1-21 16:08

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

<p>好,谢谢!!!</p>

zzzzzzzzzzqwe 发表于 2024-4-10 13:51

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

hjsbshh 发表于 2024-11-14 10:29

您好,我用的官方例程,但是一直读出的是基准电压,滑动变阻器数值不变,我和您一样的代码,我有一个问题num=4,为什么g_afe_channel不是配置四个通道。
页: [1]
查看完整版本: 芯海传感器信号调理CDS8712开发板 ADC测试