今天和分享一下极海ADC调试过程
一:简介:2 个 12 位精度的 ADC,各通道转换模式有单次、连续转换。还可以选择硬件转换触发器和硬件通道。
主要特征:
四个输入时钟源、32 个单端外部模拟输入、可选择的参考电压:外部或交替
输出
单端 12 位、10 位、8 位输出模式输出以右对齐的无符号格式为单端
转换模式:单次转换模式、连续转换模式
高性能:线性逐次逼近算法,高达 12位分辨率、自校准、可编程采样时间转换速度/功率、自动比较大于,小于或等于中断,在范围内或超出范围及可编程值
DMA 支持
转换完成/硬件平均完成标志和中断
可选择的硬件转换触发器与硬件通道选择9)
硬件平均功能
在低功耗模式下运行,降低噪声
二:软件编写流程:
1:系统时钟的选择:根据电路板的硬件设计,由于该开发板并没有外部晶振,这里我们使用的是内部的RC时钟,然后配置ADC的时钟分频器,确保ADC在工作时频率正确,最后使能使用的ADC1的时钟
2:ADC的基本参数配置:
选择合适的ADC模式,支持多种转换模式,单次转换和多次转换的模式,我个人认为还是使用连续多次转换的模式效果更好些。设置好合适的采样周期,ADC的采集到的数据不仅仅和外部传感器输入的实际数据有关,和采样的频率也息息相关,经过我个人的工作经历来说,合适的采样时间才能采集到准确的AD数据,通常采集频率过快,会导致ADC数据不稳定。较高的采样时间会增加数据的稳定性,但是这样会增加程序运行的时间。
3:在软件中配置好ADC转换的来i元,可以时外部触发、定时器或者是中断处触发等等触发方式。
4:开始转换并读取ADC的采集数据结果。
三:软件代码:void ADC_init(void)
{
/* Reset adc module */
ADC_Reset(ADC_INSTANCE);
/* Initialize ADC based on configuration values */
ADC_ConfigConverter(ADC_INSTANCE,&adcConvCfg0);
/* Verify ADC */
ADC_AutoCalibration(ADC_INSTANCE);
/* Enable hardware comparison function */
ADC_ConfigHwCompare(0,&adcCompareCfg0);
}
float ADC_readValue(void)
{
uint16_t partAdcValue;
/* Trigger using software */
ADC_ConfigChan(ADC_INSTANCE, 0u, &adcChanCfg0);
/* waiting for conversion to complete */
ADC_WaitConvDone(ADC_INSTANCE);
/* Obtain conversion flag bits */
g_compareFlag = ADC_ReadConvCompleteFlag(ADC_INSTANCE,0);
/* Obtain conversion results */
ADC_ReadChanResult(ADC_INSTANCE, 0u, &partAdcValue);
return (float)partAdcValue;
}
SysTick_Delay_ms(250);
/* Calculated voltage value */
adcValue = ADC_readValue() / g_adcMaxValue * g_adcDifference;
/* serial output ADC conversion value ,Compare flag bits */
printf("ADC conversion voltage value = %fV Compare flag bits = %d\r\n",adcValue,g_compareFlag);
if(g_compareFlag == 0)
{
LED_On(LED_RED);
LED_Off(LED_GREEN);
}
else
{
LED_On(LED_GREEN);
LED_Off(LED_RED);
}
测试ADC输出图片:
实验现象:当旋转板载的电位器时候,可以看到串口工具内ADC的变化情况,同时可以看到板载RGB灯的变化情况;
测试视频如下:
|