[DemoCode下载] 通过ADC引脚检测当前输入电压值,并通过串口输出。

[复制链接]
 楼主| dongnanxibei 发表于 2019-1-22 15:34 | 显示全部楼层 |阅读模式
功能引脚为PB0引脚。
参考电压为VREF即3.3V。
a.使能EADC时钟模块,调用CLK_EnableModuleClock和CLK_SetModuleClock进行设置
451565c46c75dc952e.png
ADC时钟源选择与设置

  1. /* 使能ADC时钟模块 */
  2. CLK_EnableModuleClock(EADC_MODULE);



 楼主| dongnanxibei 发表于 2019-1-22 15:35 | 显示全部楼层
b.由于EADC涉及到转换频率,意味着需要设置当前ADC时钟源,EADC时钟频率高达20MHz并且采样频率高达1MSPS。默认设置需要20个EADC时钟来完成一个A/D转换。
HCLK作为EADC外部时钟源,ADC时钟频率通过8位预分频器分频。
EADC 时钟频率 = (HCLK) / (EADCDIV (CLKDIV0[23:16])+1)
可通过调用库函数CLK_SetModuleClock进行设置
  1. /* 设置ADC时钟源为PLL,并进行8分频,即ADC时钟频率=72MHz/8=9MHz*/
  2. CLK_SetModuleClock(EADC_MODULE, 0, CLK_CLKDIV0_EADC(8));




 楼主| dongnanxibei 发表于 2019-1-22 15:37 | 显示全部楼层
c.设置A/D内部采样时间,调用EADC_SetInternalSampleTime进行设置,这里设置为6个ADC时钟采样时间
  1. /* 设置ADC内部采样时间为6个ADC时钟 */
  2. EADC_SetInternalSampleTime(EADC, 6);


 楼主| dongnanxibei 发表于 2019-1-22 15:40 | 显示全部楼层
d.芯片复位时,GPIO默认为数字信号通道,为了实现模拟输入,必须将当前电压检测的引脚设置为模拟信号通道
  1. /* 配置PB0引脚为ADC模拟信号输入引脚 */
  2. SYS->GPB_MFPL &= ~(SYS_GPB_MFPL_PB0MFP_Msk);
  3. SYS->GPB_MFPL |= (SYS_GPB_MFPL_PB0MFP_EADC_CH0);


 楼主| dongnanxibei 发表于 2019-1-22 15:41 | 显示全部楼层
e.接着就是按部就班的将对应的ADC组和ADC模块一一使能,当前使用的是ADC0的采样模块4
  1. /*设置ADC输入模式为单次完成同时使能A/D转换器 */
  2. EADC_Open(EADC, EADC_CTL_DIFFEN_SINGLE_END);
  3. /* 配置采样模块4作为模拟输入通道0同时设置ADINT0触发源*/
  4. EADC_ConfigSampleModule(EADC, 4, EADC_ADINT0_TRIGGER, 0);
  5. /* 使能ADC0的采样模块4中断 */
  6. EADC_ENABLE_INT(EADC, 0x1); EADC_ENABLE_SAMPLE_MODULE_INT(EADC, 0, (0x1 << 4));
  7. /* 使能NVIC ADC0_0 IRQ中断 */
  8. NVIC_EnableIRQ(ADC00_IRQn);


 楼主| dongnanxibei 发表于 2019-1-22 15:46 | 显示全部楼层
f.一切就绪后,就是准备如何获取当前A/D转换后值,为了方便获取,再编写一个用于读取A/D转换后结果的值,启动A/D转换
需要调用EADC_START_CONV函数,然后通过检测g_unAdcIntFlag变量是否被ADC00_IRQHandler中断服务函数中置1,若置1,表示当前A/D转换结束,最后调用EADC_GET_CONV_DATA函数读取转换结果值
  1. /****************************************
  2. *函数名称:ADC_Read
  3. *输        入:无
  4. *输        出:ADC数据值
  5. *功        能:获取采样模块4的ADC数据值
  6. ******************************************/
  7. UINT32 ADC_Read(VOID) {
  8. /* 启动采样模块4 */
  9. EADC_START_CONV(EADC, (0x1 << 4));
  10. /* 等待采样模块4转换结束*/
  11. while(g_unAdcIntFlag == 0);
  12. g_unAdcIntFlag = 0;
  13. /* 返回采样模块4的数据值*/
  14. return EADC_GET_CONV_DATA(EADC,4);
  15. }



 楼主| dongnanxibei 发表于 2019-1-22 15:48 | 显示全部楼层
g.由于A/D转换后得出的结果值并不是电压值,需要按照以下公式得出真正的电压值:
当前电压值= (参考电压值 * A/D转换结果值) / 2^分辨率
通过硬件设计知道,参考电压值为3.3V亦即是3300mV,同时A/D转换的是默认使用12位分辨率的,那么
当前电压值 = (3300 * ADC_Read())/ (2^12)= (3300 * ADC_Read())/4096。

最后通过printf函数打印输出到串口0。
jiekou001 发表于 2019-1-22 17:28 | 显示全部楼层
最大参考电压可以是5V吧?
jiekou001 发表于 2019-1-22 17:29 | 显示全部楼层
Vref可以大于VCC吗
mintspring 发表于 2019-1-22 23:34 | 显示全部楼层
步骤完美。
598330983 发表于 2019-1-23 10:23 | 显示全部楼层
要动手自己做,才好掌握牢固。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

223

主题

3840

帖子

18

粉丝
快速回复 在线客服 返回列表 返回顶部

223

主题

3840

帖子

18

粉丝
快速回复 在线客服 返回列表 返回顶部