📄 adcurrent.c.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 + -