打印
[DemoCode下载]

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

[复制链接]
2781|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
功能引脚为PB0引脚。
参考电压为VREF即3.3V。
a.使能EADC时钟模块,调用CLK_EnableModuleClock和CLK_SetModuleClock进行设置

ADC时钟源选择与设置

/* 使能ADC时钟模块 */
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进行设置
/* 设置ADC时钟源为PLL,并进行8分频,即ADC时钟频率=72MHz/8=9MHz*/
CLK_SetModuleClock(EADC_MODULE, 0, CLK_CLKDIV0_EADC(8));




使用特权

评论回复
板凳
dongnanxibei|  楼主 | 2019-1-22 15:37 | 只看该作者
c.设置A/D内部采样时间,调用EADC_SetInternalSampleTime进行设置,这里设置为6个ADC时钟采样时间
/* 设置ADC内部采样时间为6个ADC时钟 */
EADC_SetInternalSampleTime(EADC, 6);


使用特权

评论回复
地板
dongnanxibei|  楼主 | 2019-1-22 15:40 | 只看该作者
d.芯片复位时,GPIO默认为数字信号通道,为了实现模拟输入,必须将当前电压检测的引脚设置为模拟信号通道
/* 配置PB0引脚为ADC模拟信号输入引脚 */
SYS->GPB_MFPL &= ~(SYS_GPB_MFPL_PB0MFP_Msk);
SYS->GPB_MFPL |= (SYS_GPB_MFPL_PB0MFP_EADC_CH0);


使用特权

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


使用特权

评论回复
6
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函数读取转换结果值
/****************************************
*函数名称:ADC_Read
*输        入:无
*输        出:ADC数据值
*功        能:获取采样模块4的ADC数据值
******************************************/
UINT32 ADC_Read(VOID) {
/* 启动采样模块4 */
EADC_START_CONV(EADC, (0x1 << 4));
/* 等待采样模块4转换结束*/
while(g_unAdcIntFlag == 0);
g_unAdcIntFlag = 0;
/* 返回采样模块4的数据值*/
return EADC_GET_CONV_DATA(EADC,4);
}



使用特权

评论回复
7
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。

使用特权

评论回复
8
jiekou001| | 2019-1-22 17:28 | 只看该作者
最大参考电压可以是5V吧?

使用特权

评论回复
9
jiekou001| | 2019-1-22 17:29 | 只看该作者
Vref可以大于VCC吗

使用特权

评论回复
10
mintspring| | 2019-1-22 23:34 | 只看该作者
步骤完美。

使用特权

评论回复
11
598330983| | 2019-1-23 10:23 | 只看该作者
要动手自己做,才好掌握牢固。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

201

主题

3587

帖子

16

粉丝