要使用ADC功能,就要在PCONP选择选PCADC,在PINSEL选择对应管脚为ADC管脚。
LPC1768有8个引脚复用为A/D输入脚。
12位主次逼近式模数转换器;
测量范围:0~VREFP(通常为3V;不超过VDDA);
要使用的寄存器:
A/D控制寄存器 ADCR
A/D全局数据寄存器 ADGDR 用来存储最近一次A/D转换的结果,各个通道都有自己的数据寄存器ADDR0 ~ADDR7
以下面的实例来说明。
LPC1768板子上有个电位器与AD0.5相连接,调节电位器就可以改变AD0.,5的电压。
初始化
void ADC_Init (void) {
LPC_PINCON->PINSEL3 &= ~(3UL<<30); /* P1.31 is GPIO */
LPC_PINCON->PINSEL3 |= (3UL<<30); /* P1.31 is AD0.5 */
LPC_SC->PCONP |= (1<<12); /* Enable power to ADC block */
LPC_ADC->ADCR = (1<< 5) | /* select AD0.5 pin */
(4<< 8) | /* ADC clock is 24MHz/5 */
//CLKDIV=4
(1<<21); /* enable ADC */
}
ADC时钟不能超过13MHz,,ADC CLK=PCLK/(CLKDIV+1).
LPC_ADC->ADCR |= (1<<24); /* start conversion */
或者在之前可以加一个 LPC_ADC->ADCR &= ~(7<<24); /* stop conversion */ 来排除干扰之类的~~~,这个其实就是结束A/D转换的代码。
转换出来的数据可以再两个寄存器里看到,ADGDR和ADDR5,这里我们用的是ADGDR.
对了,还要用(LPC_ADC->ADGDR & (1UL<<31))==1来判定是否转换完成才能得到转换后的数据,
data=( LPC_ADC->ADGDR >> 4) &0xFFF;
因为ADGDR的31位,A/D转换结束置1,当数据被读出就自动清0了。
ADC_Data = (ADC_Data * 3300)/4096;
这句话的意思就是在参考电压3300mv下得到的电压,4960=,12位AD的意思,不过看网上说应该4059好些,理由摘抄如下:
ADC采集出来的数据,是0~4095,不会出现4096这个值,如果你4096等分,那就不能得到3.3V了。
会比3.3V少那么一点点。
按4095等分,那么可以从0~3.3V,线性变化,根据ADC转换结果,测量电压:最低是0V,最高是3.3V
好了,简单的A/D采样就到这。
上一篇:STM32填坑:时钟使能必须在外设初始化之前
下一篇:LPC1788 SystemInit函数分析
推荐阅读最新更新时间:2024-03-16 16:18
设计资源 培训 开发板 精华推荐
- 预约有礼:预约理想配电网络的电源完整性设计等直播,涨知识赢好礼
- 您的电路保护有足够的空间吗?Littelfuse的881系列保险丝迎接这一挑战
- “泰”想开车智能篇(下):新一代智能汽车智能化
- 半导体行业在线会员系统问卷调查 快来参与抽取50元京东卡!
- 《美光2022台北国际电脑展主题演讲精选:数据中心专辑》,关注、评论赢固态硬盘等好礼!
- 1月22日下午14:00Mouser携手Maxim邀您观看有奖直播:深入浅出可穿戴健康监测
- 停工停课不停学!罗姆R课堂正式上线
- 英飞凌家用暖通空调解决方案邀你拆盲盒
- 发帖赢好礼 | MPS 工程师为您解决DC-DC设计难题
- 【有奖直播】 聚焦语音识别核心技术,走进Microchip Timberwolf™音频处理器研讨会