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

📄 main.c

📁 ADC差分算法
💻 C
字号:
/***********************************************************************
*                             main.c
*文件功能: 主函数
*相关说明:
*编写时间: 2007年7月13日
*编写作者: 劳永彬
***********************************************************************/

#include <avr/io.h>
#include <avr/interrupt.h>

#include "UART.h"
#include "ADCurrent.h"

volatile uint16_t Timer;

/***************************************************
函数名称:PortInit()
函数功能:初始化IO口
输入参数:无
返回参数:无
影响的全局变量:无
***************************************************/
void PortInit(void)
{
	PORTA  = 0x00;			//关闭上拉电阻
	DDRA   = 0x00;			//AD输入
	PORTB  = 0x00;
	DDRB   = 0x00;
	PORTC  = 0x00;
	DDRC   = 0xFF;
	PORTD  = 0x00;
	DDRD   = 0x00;
	TIMSK  = 0x00;			//清中断允许寄存器
}

/***************************************************
函数名称:void TimerInit(void)
函数功能:初始化定时时钟,T2,CTC模式,5ms自动重载
输入参数:无
返回参数:无
影响的全局变量:无
***************************************************/
void TimerInit(void)
{
	TCNT2  = 0x00; 
	OCR2   = 77; 
	TIFR  |= (1<<OCF2);							//清匹配中断标志位
	TIMSK |= (1<<OCIE2);						//允许匹配中断
	TCCR2  = (1<<WGM21)|(1<<CS20)|(1<<CS21)|(1<<CS22);	//1024分频,CTC模式
	/*
		Fi = F_CPU(16000) / (OCR0(77+1) * n(1024) ) = 0.2KHz
		Ti = 1/Fi = 1/0.2 = 5ms
	*/
}

/***************************************************
函数名称:SIGNAL(SIG_OUTPUT_COMPARE2) 
函数功能:定时器匹配中断,5ms定时中断
输入参数:无
返回参数:无
影响的全局变量:刷新各采样间隔和各任务延时以及系统时钟
***************************************************/
SIGNAL(SIG_OUTPUT_COMPARE2) 
{
	if (Timer > 0)				//如果电机运行
	{
		Timer --;				//电机运行时间减1
	}
}

/***************************************************
函数名称:main()
函数功能:主函数
输入参数:无
返回参数:无
影响的全局变量:无
***************************************************/
int main(void)
{
    PortInit();
    TimerInit();
    ADInit();
    UARTInit();
    
    PORTC      = (0x01<<4);                 //启动电机2
    
    SampleList = 0x02;                      //AD2作为正差分输入
/**以下两行是采用中断方式采样,如果采用查询方式进行则不需要这两行**/
	ADCSRA |= (1<<ADIE);				    //开ADC中断
	SetADC();							    //第一次转换
/******************************************************************/
	sei();
	
	while(1)
	{
	    Timer = 200;                  //1秒定时,每一秒发送一次数据
	    
	    while (Timer != 0) ;
/**以下三行是采用查询方式采样,如果采用中断方式进行则不需要这三行***/        
//        Current[2] = ReadVoltage(SampleList+2);
//        Current[1] = ReadVoltage(SampleList+1);
//        Current[0] = ReadVoltage(SampleList);
/*******************************************************************/
        cli();
        PutByte((uint8_t)(Current[0]>>8));
        PutByte((uint8_t)(Current[0]));
        PutByte((uint8_t)(Current[1]>>8));
        PutByte((uint8_t)(Current[1]));
        PutByte((uint8_t)(Current[2]>>8));
        PutByte((uint8_t)(Current[2]));
        PutByte('\r');
        PutByte('\n');
        
        Current[0] = 0;
        Current[1] = 0;
        Current[2] = 0;
        
        sei();
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -