打印
[MCU]

ADC采样外部电压输出0-3.3V问题

[复制链接]
1307|27
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
houcs|  楼主 | 2020-12-9 19:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
哪位大神帮忙看下哪里出现的问题本来是采样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:aaa\n"; //发送的字符串,字符串末尾通常都会有一个默认的\0结束符

/*******************************************
函数名称: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] = '\0';
  buffer1[3]='\0';
  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;
}
*/

使用特权

评论回复

相关帖子

沙发
yufe| | 2020-12-9 19:28 | 只看该作者
average定义的范围小了,定义成unsigned long 就可以了

使用特权

评论回复
板凳
huwr| | 2020-12-9 19:31 | 只看该作者
采样32个数求和求平均时,32个数之和大于65536,所以定义unsigned int 不合适,应当定义为unsigned long

使用特权

评论回复
地板
zwll| | 2020-12-9 19:37 | 只看该作者
测一下芯片的参考电压是不是对的

使用特权

评论回复
5
hanwe| | 2020-12-9 19:41 | 只看该作者
若采用外部供电参考电压的话,需要改电压稳定可靠。

使用特权

评论回复
6
xxrs| | 2020-12-9 19:45 | 只看该作者
该程序分享非常好的

使用特权

评论回复
7
yufe| | 2020-12-9 19:49 | 只看该作者
这个重点看下参考电压的稳定性及范围的

使用特权

评论回复
8
llljh| | 2020-12-9 19:52 | 只看该作者
电压太高了吗

使用特权

评论回复
9
wangzsa| | 2020-12-9 19:58 | 只看该作者
2V-3.3V采样不正常?只有这个段吗

使用特权

评论回复
10
happy_10| | 2020-12-9 20:02 | 只看该作者
有可能是硬件的问题

使用特权

评论回复
11
songqian17| | 2020-12-9 20:06 | 只看该作者
代码没有问题的

使用特权

评论回复
12
wangpe| | 2020-12-9 20:09 | 只看该作者
这个还真没有遇到过

使用特权

评论回复
13
gongche| | 2020-12-9 20:21 | 只看该作者
你的参考电压多大?

使用特权

评论回复
14
wenfen| | 2020-12-9 20:27 | 只看该作者
是不是超出测量范围了呢

使用特权

评论回复
15
stly| | 2020-12-9 20:32 | 只看该作者
数值有问题?

使用特权

评论回复
16
xxrs| | 2020-12-9 20:35 | 只看该作者
单步调试看看

使用特权

评论回复
17
zyf部长| | 2020-12-9 20:40 | 只看该作者
使用外部的芯片吧

使用特权

评论回复
18
gongche| | 2020-12-9 20:47 | 只看该作者
这个变量有啥问题?

使用特权

评论回复
19
zhanglli| | 2020-12-9 20:50 | 只看该作者
测量信号看看什么问题

使用特权

评论回复
20
zwll| | 2020-12-9 20:54 | 只看该作者
代码写的正确的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

743

主题

8382

帖子

5

粉丝