主要截取PDF中
而40/44引脚器件的模数转换器则具有13路输入。A/D模块能将一个模拟输入信号转换成相应的10位数字信号。
执行A/D转换时应该遵循以下步骤:
1. 配置A/D模块:
• 配置模拟引脚、参考电压和数字 I/O(通过
ADCON1寄存器)
• 选择A/D输入通道 (通过ADCON0寄存器)
• 选择A/D采集时间 (通过ADCON2寄存器)
• 选择A/D转换时钟 (通过ADCON2寄存器)
• 使能A/D模块 (通过ADCON0寄存器)
2. 需要时,配置A/D中断:
• 清零ADIF位
• 将ADIE位置1
• 将GIE位置1
3. 如果需要,等待所需的采集时间。
4. 启动转换:
• 将GO/DONE位置1(通过ADCON0寄存器)
5. 等待A/D转换完成,通过以下两种方法之一判断
转换是否完成:
• 查询GO/DONE位是否被清零
• 等待A/D中断
6. 读取A/D结果寄存器(ADRESH:ADRESL),需
要时将ADIF位清零。
7. 如需再次进行A/D转换,返回步骤1或步骤2。
将每位的A/D转换时间定义为TAD,在下一次采
集开始前至少需要等待3个TAD。
控制C程序:
开启RA1,模拟入口
#include<adc.h>
void Init_adc(void)
{
TRISA1 = 1;// input
// PORTAbits.AN0=1;
ADCON1=0x0d;//AIN0,AIN1 was anolog
ADCON0 |= 0x04;//set 1 channel
ADCON2=0x90;// 右对齐 AD 4Tad Fosc/2 转换时间,采样频率需要弄清楚
ADCON0bits.ADON=1; // enable ADc
//PIR1bits.ADIF=0; //enable intrrupt
ADRES=0x0000;
}
int Get_onetime_ad(void)
{
unsigned char H=0,L=0;
ADCON0bits.GO=1;// start convert
while(ADCON0bits.GO);
//PIR1bits.ADIF=0;
H=ADRESH;
L=ADRESL;
return abs((H<<8)+L); //标度变化 0-5V
}
void main()
{
int temp=0;
float tmp=0;
char *buff;
int state;
while(1)
{
Init_adc();
__delay_ms(10);
temp=Get_onetime_ad();
tmp=(float)temp;
tmp=(tmp*5)/1024;
//int数据保存到float中,后做除法
buff=ftoa(tmp,&state);
Display_char(1,2,"V: ");
Display_char(13,2,buff);
}
}
需要补充的是:关于Tad,和转换频率,详见PDF中的分析!(待项目深入后再做研究)
| 有奖活动 | |
|---|---|
| 这个春节你犒赏自己什么了?分享你的故事,有奖征集 | |
| 2026年“我要开发板活动”第三季,开始了! | |
| 硬核工程师专属补给计划——填盲盒 | |
| “我踩过的那些坑”主题活动——第002期 | |
| 【EEPW电子工程师创研计划】技术变现通道已开启~ | |
| 发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
| 【EEPW在线】E起听工程师的声音! | |
| 高校联络员开始招募啦!有惊喜!! | |
我要赚赏金打赏帖 |
|
|---|---|
| 【S32K3XX】SWT 模块使用被打赏¥22元 | |
| 【分享开发笔记,赚取280元手持便携数字示波器】32位linux内核内存映射896的理解被打赏¥14元 | |
| AG32VH407开发板例程体系的构成与使用方法被打赏¥20元 | |
| 【S32K3XX】SEMA42 模块使用被打赏¥26元 | |
| 【S32K3XX】XRDC 功能使用被打赏¥22元 | |
| 【分享开发笔记,赚取280元手持便携数字示波器】8051使用keil编译的程序移动心得被打赏¥21元 | |
| 【S32K3XX】HSE 密钥管理被打赏¥17元 | |
| 【S32K3XX】Standby RAM的初始化流程被打赏¥18元 | |
| Gravity:中英文语音合成模块V2.0及其串口控制被打赏¥24元 | |
| 全彩色度变化图的绘制被打赏¥27元 | |
我要赚赏金
