📄 adc.c
字号:
/*
Mega8 中断方式 A/D 转换测试程序
main.c
硬件:CA-M8
编译:WinAVR-20040720
芯艺 2004-09-19
*/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/delay.h>
#include <stdio.h>
#include <math.h>
#include "Uart.h"
#define uchar unsigned char
#define uint unsigned int
#define Vref 25630
static uint g_nAdValue=0;
//A/D转换完成中断
SIGNAL(SIG_ADC)
{
g_nAdValue = ADCL;
g_nAdValue |= (uint)(ADCH<<8);
}
int CInt(float ki)
{
int tmpki;
int retint;
if(ki == 0) return 0;
tmpki=(int)fabs(ki*10) % 10;
retint=(int)ki;
if( tmpki >= 5)
{
if(ki>0)
retint=retint+1;
else
retint=retint-1;
}
return retint;
}
int main(void)
{
uchar i;
//内部2.65v参考电压,0通道
//DDRC = _BV(PC0);
//PORTC = _BV(PC0);
OSCCAL = 0x7d;
DDRC = 0x00;
PORTC = 0x00;
//ADMUX = 0xc0; //11 00 0000
ADMUX = _BV(REFS1)|_BV(REFS0);
ACSR = (1<<ACD);
/*
ADMUX ADC多路复其选择寄存器 - ADMUX
7 6 5 4 3 2 1 0
REFS1 REFS0 ADLAR - MUX3 MUX2 MUX1 MUX0
REFS1,REFS0:
0 0 外部引脚AREF,断开内部参考源连接
0 1 AVcc,Aref外部并接电容
1 0 保留
1 1 内部2.56V,AREF外部并接电容
//此处11为内部2.56V
ADLAR=0右对齐
MUX3..0:0000 - ADC0
*/
//使能ADC,终端允许,自由模式,时钟CLK/8
ADCSRA = _BV(ADEN)|_BV(ADIE)|_BV(ADFR)|_BV(ADPS1)|_BV(ADPS0);
/*
7 - ADEN: ADC使能
6 - ADSN:ADC开始转换
5 - ADFR:ADC连续转换模式选择
4 - ADIF:ADC中断标志位
3 - ADIE:ADC中断允许
2 ..0 - ADPS2:0:ADC预分频选择
000 - 2 ; 001 - 2;010 - 4; 011 - 8;
100 - 16;101 - 32;110 - 64;111 - 128
*/
/*计算公式
ADC(ADCH+ADCL) = (Vin * 1024)/Vref
Vin :选定的输入因交上的电压,Vref选定的参考电源的电压
*/
char* TmpStr = "0.000 V ";
float TmpVal;
unsigned int TmpPP;
TmpStr[7]='\n';
Uart_Init(25);
ADCSRA |= _BV(ADSC);//自由模式开始转换
while(1)
{
for(i=0;i<100;i++)
_delay_loop_2(4*250*1);//10ms
cli();
//TmpVal = (float) ( (float)(Vref/1023) * (ADC&0X3ff) )/1000.00;
TmpVal = (float)/*CInt(*/ (float)(((float)((Vref/1023)))*( ADC &0X3FF))/1000.00/*)*/;
TmpPP = fabs(TmpVal * 100);
//TmpPP = TmpVal * 100;
//TmpPP = 0xffff-TmpPP;
//intf("%X %x\n",(int)(TmpVal * 100),TmpPP);
TmpStr[0] =TmpPP/1000 + 0x30;
TmpPP =TmpPP % 1000;
TmpStr[2] = TmpPP/100 + 0x30;
TmpPP = TmpPP % 100;
TmpStr[3] =TmpPP/10 + 0x30;
TmpPP= TmpPP% 10;
TmpStr[4] =TmpPP + 0x30;
Uart_PutStr(TmpStr);
//printf("%d,%s\n",g_nAdValue,TmpStr );
sei();
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -