AMIC 信号采集
例程路径:ls_sdk\examples\peripheral\adcv2\adc_amic_sampling
一、功能描述
本示例使用amic采集信号。
二、软件配置
2.1 Amic IO 配置
例程中我们使用Amic的专用通道,使用以下函数配置相应IO的复用功能。
pinmux_amic_init(); //PB10
2.2 基本Amic采样配置
void ADC_Init_Func(void)
{
pinmux_amic_init();
ADCx_Hdl.Instance = LSADC2; //选择ADC2
ADCx_Hdl.Init.DataAlign = ADC_DATAALIGN_RIGHT; //数据右对齐
ADCx_Hdl.Init.ContinuousConvMode = DISABLE; //单通道采样,不需要置为连续模式
ADCx_Hdl.Init.NbrOfConversion = 1; //配置循环模式转换序列长度
ADCx_Hdl.Init.DiscontinuousConvMode = DISABLE; //不使用间断转换模式
ADCx_Hdl.Init.NbrOfDiscConversion = 0; // 间断转换序列长度
ADCx_Hdl.Init.TrigType = ADC_SOFTWARE_TRIGT; //触发方式选择,通常为软件触发
ADCx_Hdl.Init.Vref = ADC_VREF_INSIDE; //参考源选择,这里选择内部参考电压
ADCx_Hdl.Init.AdcDriveType = INRES_ONETHIRD_EINBUF_DRIVE_ADC; //采样路径选择,这里输入信号1/3分压之后,经过运放驱动ADC
ADCx_Hdl.Init.AdcCkDiv = 256; //ADC 时钟分频,可以配置为0~0x1FF
if (HAL_ADC_Init(&ADCx_Hdl) != HAL_OK)
{
Error_Handler();
}
}
2.3 循环模式通道配置
void ADC_LoopMode_Channel_setcfg(void)
{
ADC_LoopConfTypeDef sConfig = {0};
sConfig.Channel = ADC2_CHANNEL_AMIC; //Amic通道选择,与具体io对应
sConfig.Rank = ADC_LOOP_RANK_1; //采样序列配置,这里表示第一次采样的通道
sConfig.SamplingTime = ADC_SAMPLETIME_15CYCLES; //采样的周期
sConfig.LoopClk = ADC_CH_CLOCK_DIV1; //通道时钟配置
sConfig.NbrOfConversion = 1; //循环模式采样序列长度
sConfig.CapIntv = 0xffff; //两次捕获序列之间的间隔,轮询模式此配置无效
if(HAL_ADC_LoopConfigChannel(&ADCx_Hdl,&sConfig)!= HAL_OK)
{
Error_Handler();
}
}
/*开始中断采集 */
HAL_StatusTypeDef HAL_ADCx_LoopStart_IT(ADC_HandleTypeDef *hadc);
/*采集完成后的中断回调,需要在回调函数里面去获取ADC的值*/
void HAL_ADCx_LoopConvCpltCallback(ADC_HandleTypeDef* hadc);
对于循环组使用,应用上面只需要触发一次,在完成一轮采样后会自动继续下一轮的采样。为了避免出现FIFO溢出的情况,通常需要在回调函数内去获取FIFO中有几组数据,然后再将FIFO中数据全部读出。
三、下载验证
设置ADC的信号输入通道为AMIC,对应io为PB10,控制DG4162信号发生器输出信号VPP = 2.5v,Voffet = 1.65V,信号输出频率为4.7KHZ,运行程序,打开RTT LOG查看打印信息。采样数据应是一个正弦波。