哪位大神帮忙看下哪里出现的问题本来是采样0-3.3V输出,现在只有0-2V采样正常,2V-3.3V采样不正常,请问下问题出在哪里?
main.c
#include "config.h"
#define keyin (P1IN & 0x0f)
#define Num_of_Results 32
#define ANGLE 360
#define AVRVALUE 330
uint16_t results[Num_of_Results]; //保存ADC转换结果的数组
uint16_t average;
uint8_t tcnt = 0;
void delay(void);
uint8_t Data[]="a:aaan"; //发送的字符串,字符串末尾通常都会有一个默认的结束符
/*******************************************
函数名称:ADC12ISR
功 能:ADC中断服务函数,在这里用多次平均的
计算P6.0口的模拟电压数值
参 数:无
返回值 :无
********************************************/
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR (void)
{
static uint8_t index = 0;
results[index++] = ADC12MEM0; // Move results
if(index == Num_of_Results)
{
uint8_t i;
average = 0;
for(i = 0; i < Num_of_Results; i++)
{
average += results;
}
average >>= 5; //除以32
index = 0;
tcnt++;
if(tcnt == 250) //主要是降低串口发送速度
{
LPM1_EXIT;
tcnt = 0;
}
}
}
void main()
{
uint8_t i;
uint8_t buffer[5];
uint8_t buffer1[4];
WDTCTL = WDTPW + WDTHOLD;
P2DIR |= BIT0;
P2OUT |= BIT0; //L8输出,熄灭 为1熄灭,为0点亮
InitUART(); //调用初始化函数
Init_ADC();
_EINT();
buffer[4] = '';
buffer1[3]='';
uint16_t vol_100=0;
uint16_t ang_val=0;
while(1)
{
if(keyin != 0x0f)
{
delay();
if(keyin != 0x0f)
{
while(keyin != 0x0f);
P2OUT ^= BIT0;
//uart0发送ON
sendString("ON");
}
}
LPM1;
Hex2Dec(average,buffer);
for(i = 0; i < 4; i++)
buffer += 0x30;
sendString(buffer);
/*
Trans_val(average,buffer);
buffer[3] = buffer[2];
buffer[2] = buffer[1];
buffer[1] = 0x2e - 0x30;
vol_100=buffer[0]*100+buffer[2]*10+buffer[3]*1;
for(i = 0; i < 4; i++)
{
buffer += 0x30;
}
sendString(buffer);
ang_val=(ANGLE*vol_100)/AVRVALUE;
buffer1[0]=ang_val/100;
buffer1[1]=ang_val%100/10;
buffer1[2]=ang_val%10;
for(i = 0; i < 3; i++)
{
buffer1 += 0x30;
}
sendString(buffer1);
*/
}
}
/*******************************************
函数名称:delay
功 能:用于消抖的延时
参 数:无
返回值 :无
********************************************/
void delay(void)
{
uint16_t tmp;
for(tmp = 12000;tmp > 0;tmp--);
}
ADC_Fun.c
#include "config.h"
//#define ANGLE 360
//#define AVRVALUE 2048
/********************************************
函数名称:Init_ADC
功 能:初始化ADC
参 数:无
返回值 :无
********************************************/
void Init_ADC(void)
{
P6SEL |= 0x01; // 使能ADC通道
ADC12CTL0 = ADC12ON+SHT0_15+MSC; // 打开ADC,设置采样时间
ADC12CTL1 = SHP+CONSEQ_2; // 使用采样定时器
ADC12IE = 0x01; // 使能ADC中断
ADC12CTL0 |= ENC; // 使能转换
ADC12CTL0 |= ADC12SC; // 开始转换
}
/********************************************
函数名称:Hex2Dec
功 能:将16进制ADC转换数据变换成十进制
表示形式
参 数:Hex_Val--16进制数据
ptr--指向存放转换结果的指针
返回值 :无
********************************************/
void Hex2Dec(uint16_t Hex_val,uint8_t *ptr)
{
ptr[0] = Hex_val / 1000;
ptr[1] = (Hex_val - ptr[0]*1000)/100;
ptr[2] = (Hex_val - ptr[0]*1000 - ptr[1]*100)/10;
ptr[3] = (Hex_val - ptr[0]*1000 - ptr[1]*100 - ptr[2]*10);
}
/*******************************************
函数名称:Trans_val
功 能:将16进制ADC转换数据变换成三位10进制
真实的模拟电压数据,并在液晶上显示
参 数:Hex_Val--16进制数据
返回值 :无
********************************************/
void Trans_val(uint16_t Hex_Val,uint8_t *ptr)
{
uint32_t caltmp;
uint16_t Curr_Volt;
uint8_t t1;
caltmp = Hex_Val;
caltmp = (caltmp << 5) + Hex_Val; //caltmp = Hex_Val * 33
caltmp = (caltmp << 3) + (caltmp << 1); //caltmp = caltmp * 10
Curr_Volt = caltmp >> 12; //Curr_Volt = caltmp / 2^n
ptr[0] = Curr_Volt / 100; //Hex->Dec变换
t1 = Curr_Volt - (ptr[0] * 100);
ptr[1] = t1 / 10;
ptr[2] = t1 - (ptr[1] * 10);
}
//转化成角度值
/*
void Conv_AngleVal(uint16_t Hex_Val,uint8_t *ptr)
{
uint16_t cir_angle;
uint8_t temp;
uint8_t emp1;
cir_angle=(ANGLE*Hex_Val)/AVRVALUE;
ptr[0]=(cir_angle/100);
temp=cir_angle-(ptr[0]*100);
ptr[1]=temp/10;
ptr[2]=temp-ptr[1]*10;
//temp1=ptr[0];
//ptr[0]=ptr[3];
//ptr[3]=temp1;
} |