⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adc.c

📁 avr c 模拟数据采集的程序设计方法 本程序为模数转换的例程
💻 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 + -