今天和分享一下极海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灯的变化情况;
测试视频如下:
|