原创
AVR中AD转换程序(转贴别人的算一个记号)
嘿嘿,这两天在看别人写的AVR中AD转换程序,自已拼凑起一个能用的,觉得蛮好玩。贴出来共享
下面这个程序在ATMEGA16L上通过,直接在LCM上显示PA0口的电压。单位是0.1mV
本程序只是偶试验AVR的AD转换功能而写,也并非我原创,只是消化了别人的程序凑起来的。但绝对能用。
同时也望大虾们指点一二。
//单端通道,不放大
#define AD_SE_ADC0 0x00 //ADC0
#define AD_SE_ADC1 0x01 //ADC1
#define AD_SE_ADC2 0x02 //ADC2
#define AD_SE_ADC3 0x03 //ADC3
#define AD_SE_ADC4 0x04 //ADC4
#define AD_SE_ADC5 0x05 //ADC5
#define AD_SE_ADC6 0x06 //ADC6
//常量定义
#define Vref 2650 //mV
/*********AD转换函数******************/
//AD转换函数
//ADC_PORT为输入的端口
/**************************************/
uint16_t Measured_Vol_INT(unsigned char ADC_PORT)
{
uint16_t M_Volt=0; //变换后的电压mV
uint32_t temp32;
uint8_t i;
ADMUX=0xC0|ADC_PORT; //片内基准电压,单端输入.
/*
ADMUX (ADC Multiplexer Select Register)
bit7 bit6
REFS1 REFS0 参考电压选择
0 0 AREF,内部Vref关闭
0 1 AVCC,AREF引脚外加滤波电容
1 0 保留
1 1 2.56V的片内基准电压源,AREF引脚外加滤波电容
bit5 ADC结果左对齐选择 1=左对齐 0=右对齐
bit4~0 选择32通道
*/
ADCSRA=(1<<ADEN)|(0<<ADSC)|(0<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
/*
ADCSRA (ADC Control and Status Register A)
bit7 ADEN ADC使能=1
bit6 ADSC 启动ADC开始转换=1
bit5 ADATE 自己触发使能
bit4 ADIF ADC中断标志
bit3 ADIE ADC中断使能
bit2:0 ADC 预分频选择位 111=128时钟分频
*/
asm ("sleep");
for(i=0;i<24;i++)
{
ADCSRA|=(1<<ADSC); //启动ADC开始转换
while ((ADCSRA&0x10)!=0x10); //等待ADC转换结束
ADCSRA|=(1<<ADIF); //写1清除标志位
ADCSRA|=~(1<<ADSC); //启动ADC开始转换
temp32=(uint32_t)ADC*Vref;
M_Volt+=(uint16_t)(temp32/1023);
}
ADCSRA&=~(1<<ADIE); //禁止ADC中断
return(M_Volt/24);
}
/****************************************/
/*主函数*/
/****************************************/
int main(void)
{
DelayMs(100); /*延时100ms*/
Lcminit(); /*液晶模块初始化 */
myprintf("mV%");
while(1)
{
DelayMs(500); /*延时500ms*/
col=0;row=2;
myprintf(" %");
col=60;row=2;
show_long((unsigned long)Measured_Vol_INT(AD_SE_ADC0));//获取端口PA0的转换数据
}
}
用户34281 2008-8-1 16:01