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

📄 adcurrent.c.bak

📁 ADC差分算法
💻 BAK
字号:
/**********************************************************************
*                                   ADCurrent.c
*
*
*AD采用了差分模式,内部参考电压,其中负端输入是AD1,三个通道轮流采样,
把采集到的数据通过串口发送到上位机显示。调试时上位机接收时要用16进制显示
***********************************************************************/

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

#include "ADCurrent.h"

/***************************************************
函数名称:ADInit()
函数功能:初始化AD
输入参数:无
返回参数:无
相关说明:128分频,16M/128=125K,采样一次约13/125ms=104us
          参考电压为2.56V,右对齐,dV = (2560*ADC)/512
          其中 dV = Vpos(正差分电压) - Vneg(负差分电压)
          在本系统中,dV表示电流值,实际的电流为 I = (13.3*dV)/3.3
          AD4----------电机3正端
          AD3----------电机2正端
          AD2----------电机1正端
          AD1----------电池端(负差分输入端)
          
影响的全局变量:无
***************************************************/
void ADInit(void)
{
	ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);//使能ADC,不允许中断
	ADMUX  = (1<<REFS0)|(1<<REFS0)|(1<<MUX4);           //0xD0
}

/***************************************************
函数名称:ReadVoltage()
函数功能:读取AD转换的电压值,转换一次要312us
输入参数:通道号:channal,为0、1、2、3、4
返回参数:转换出来的电压值:十位有效值
影响的全局变量:无
***************************************************/
uint16_t ReadVoltage(uint8_t channal)
{
	uint16_t temp;
	uint8_t i;
	
	temp=0;
    
    while (ADCSRA&(1<<ADSC)) ;                  //等待ADC空闲
    
	ADMUX  = (0xD0|channal);				    //设定转换通道
	
	for(i=0;i<=2;i++)
	{
		ADCSRA |= (1<<ADSC);					//开始转换
		loop_until_bit_is_set(ADCSRA,ADIF);		//等待转换结束
		ADCSRA |= (1<<ADIF);					//清标志位
		temp    = ADC;
	}
	
	if (temp >= 0x200)                          //如果为负数,补码形式
	{
	    temp = 0x3FF - temp;
	    temp ++;                                //加一后为原码
	}
	
	return temp;								//8位精度
}

/***************************************************
函数名称:SIGNAL(SIG_ADC)
函数功能:ADC转换完成中断
输入参数:无
返回参数:无
影响的全局变量:
***************************************************/
SIGNAL(SIG_ADC)
{
	uint16_t temp;
	
	temp = ADC;
	
	if (SampleList >= 0x20)                     //第三次采样
	{
	    if (temp >= 0x200)                      //如果为负数,补码形式
	    {
	        temp = 0x3FF - temp;
	        temp ++;                            //加一后为原码
	    }
	    
	    *PADCData = temp;                       //更新数据
        
	    SetADC();                               //更换通道
	}
	else                                        //第一次采样
	{
		ADCSRA     |= (1<<ADSC);				//开始转换
		SampleList += 0x10;
	}
}

/***************************************************
函数名称:SetADC()
函数功能:设置ADC转换通道并启动转换,转换一次要208us
输入参数:无。通道设置通过查采样等待列表得出
返回参数:无。在中断中读取数据
相关说明:该子程序是在中断中调用的
影响的全局变量:无
***************************************************/
void SetADC(void)
{
	SampleList ++;
	
	SampleList &= 0x0F;						//高字节清空
	
	if ((SampleList >= 5)||(SampleList < 2))
	{
		SampleList = 2;					    //实现循环
	}
	
	PADCData = &Current[SampleList-2];		//更新数据存放地址指针
	
	ADMUX   = (0xD0|SampleList);			//设定转换通道
	ADCSRA |= (1<<ADSC);					//开始转换
}

⌨️ 快捷键说明

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