芯海传感器信号调理CDS8712开发板 ADC测试
<div style="text-align: center;"></div><p>
<p><span style="color:#16a085;">元旦前收到版主提供的资料,对照例程先测试了下ADC采集。计划配置为单端采集,如上图接入一滑动电阻器。</span></p>
</p>
<p><span style="color:#16a085;">调试口的RST没有连接,芯片RST是高电平复位,调试器输出的复位是低电平。</span></p>
<p><span style="color:#16a085;">上电按例程先执行 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 < 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(); 在这里配置通道属性</span></p>
<p><span style="color:#16a085;">开启了 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 < 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 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(&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);
}</code></pre>
<p> </p>
<p><span style="color:#16a085;">hal_afe_sample_param_init(); 在这里配置通道属性</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 < 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);
}</code></pre>
<p><span style="color:#16a085;">最后循环调用void hal_afe_sample(void) </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 < 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> </p>
<div style="text-align: center;"></div>
<p> </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> </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(&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(&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> </p>
<p>用J-LINK为开发板供电的电压是几伏?</p>
<p>3.3V,官方的例子直接就能跑通printf</p><br/> bcqat89m 发表于 2024-1-12 19:10
3.3V,官方的例子直接就能跑通printf
<p>好,谢谢!!!</p>
<p>楼主你好,我用官方例程去adc读取内部温度传感信号,程序一直卡在检查校准标志位那,请问你有碰到过这种情况吗</p>
您好,我用的官方例程,但是一直读出的是基准电压,滑动变阻器数值不变,我和您一样的代码,我有一个问题num=4,为什么g_afe_channel不是配置四个通道。
页:
[1]