我自己写了个149的adc12单通道序列转换的程序,使用的是p6.0(A0通道),结果现象正确,可是吧程序中控制A0通道的寄存器参数改成对应的控制p6.1的A1通道的寄存器参数,其余地方不动,结果转换的结果不对。其中A1输入一个模拟电压转换的结果数字不变。有时候还出现一些随机数字,请问什么原因。
Young Hu:
gj chen,
您好,
最可能的原因就是程序中有些部分没有修改,建议你将代码贴上来。
Peter_Zheng:
ADC修改的时候一个是ADC12INCH通道修改,一个是转换值ADC12MEMx的修改,您的问题肯定是由于ADC寄存器修改的地方不对导致的,建议再检查一下代码。
gj chen:
回复 Young Hu:
//*****此程序实现的是以ADC12内部的2.5v的参考电压,对a0通道进行32次采集平均后,把采集结果在数码管上显示*****//
#include <msp430x14x.h>
#define Num_of_Results 32
#define uint unsigned int
#define uchar unsigned char
uchar seg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,};//0-9对应的共阴极段码
uint results[Num_of_Results] = {0};
unsigned long int average=0;
//***********ADC12的初始化函数********************//
void ADC_Init(void)
{
P6SEL |= BIT0;// 设置p6.0为a0采样通道
ADC12CTL0 &= ~ENC;
ADC12CTL0 = ADC12ON+SHT0_15+MSC;
ADC12CTL1 = SHP+CONSEQ_2+CSTARTADD_0; //采样定时器触发采样、单通道多次转换
ADC12MCTL0 = INCH_0;//a0通道、Vr+=Vref+,Vr-=AVcc
ADC12IE = 0x01; // 使能中断
ADC12CTL0 |= ENC;
ADC12CTL0 |= ADC12SC;// 开始转换
_EINT();
}
//*****************延时函数**********************//
void delay_ms()
{for(uint i=500;i>0;i–);}
////**********数码管动态显示程序********************//
void display(uint num)
{ uint qian=(num / 1000);
uint bai=(num-(num/1000)*1000)/100;
uint shi=(num-qian*1000-bai*100)/10;
uint ge=(num-qian*1000-bai*100) %10;
//显示端口初始化
P3SEL=0x00;//p3作为i/o
P3DIR=0x0f;//p3.0-p3.3作为输出
P3OUT|=0x0f;//关闭数码管位选信号
P4SEL=0x00;//p4作为i/o
P4DIR=0xff;//p4为输出
P4OUT=0x00;//数码管不亮
P4OUT = seg[qian];//千位数字段选
P3OUT^=BIT0;//打开千位位选
delay_ms(); //显示1ms千位
P4OUT=0x00;//消掉阴影
P3OUT^=BIT0;//关闭千位位选
P4OUT = seg[bai];//送百位段码
P3OUT^=BIT1;//打开百位位选
delay_ms(); //显示1ms个位
P4OUT=0x00;//消掉阴影
P3OUT^=BIT1;//关闭百位位选
P4OUT = seg[shi];//十位数字段选
P3OUT^=BIT2;//打开十位位选
delay_ms(); //显示1ms十位
P4OUT=0x00;//消掉阴影
P3OUT^=BIT2;//关闭十位位选
P4OUT = seg[ge];//送个位段码
P3OUT^=BIT3;//打开个位位选
delay_ms(); //显示1ms个位
P3OUT^=BIT3;//关闭个位位选
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // 关狗
ADC_Init(); // 初始化ADC12
_EINT(); //开总中断
while(1)//显示
{ _BIS_SR(LPM0_bits+GIE); //进入低功耗
display(average);
}
}
//*********中断服务****************//
#pragma vector=ADC12_VECTOR
__interrupt void ADC12ISR (void)
{
static uint index = 0;
results[index++] = ADC12MEM0;
if (index == 32)
{
// ADC12CTL0 &= ~ENC;
index = 0;
for(uchar i=0;i<32;i++)
{average+=results[i];}
average>>=5;
_BIC_SR_IRQ(LPM0_bits) ;
}
}
gj chen:
回复 Young Hu:
代码已经黏贴,麻烦指点,新手初学,谢谢。
Young Hu:
回复 gj chen:
gj chen,
这个不是采集A0通道的代码么?这个是正常工作的吧?
gj chen:
恩,的确,黏贴的程序是A0通道的,能正常工作,但是把控制A0的寄存器全部对应改成控制A1的寄存器,就不知怎么程序不能得到正常现象了。如果可以,麻烦给个正确控制A1或则其他通道的示例程序,谢谢。
Young Hu:
手头暂时没有这方面的代码。请参考peter zheng给你的建议。或者把你的错误代码发上来
Peter_Zheng:
把你错误代码贴出来。
我下面这段代码是基于msp4305529 A1的,参考一下
#include "msp430f5529.h"
void Init_ADC(void)
{
P6SEL |= BIT6; // Enable A/D channel A0
ADC12CTL0 = ADC12SHT0_8;// Set sample time
ADC12CTL1 = ADC12SHP; // Enable sample timer
ADC12MCTL0 = ADC12SREF_0 + ADC12INCH_1;
}
unsigned char luminary_measure()
{
unsigned char temp;
ADC12CTL0 |= ADC12ENC+ ADC12ON;
ADC12CTL0 |= ADC12SC; // Start conversion
while (!(ADC12IFG & BIT0));
temp=(ADC12MEM0>>4)/3;
ADC12CTL0 &= ~(ADC12ENC+ ADC12ON);
return temp;
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P1DIR |= 0x01; // P1.0 output
Init_ADC();
while(1)
{
if(luminary_measure()>0x1F)
P1OUT|=BIT0;
else
P1OUT&=~BIT0;
}
}
gj chen:
我这个附件里的程序是想实现在程序上电时数码管显示8888,当矩阵键盘中key1按下时显示A0通道转换的模数值,按下key2时显示通道A1的模数值,按下key3时显示A2通道的模数值。结果发现只有A0通道能正确转换并显示,而A1和A2通道则不能转换,却显示一些随机数在数码管上。请问怎么回事?如果要实现我说的功能,如何修改,期待回复。谢谢。
Peter_Zheng:
回复 gj chen:
大概看了你的代码,AD这块没看出啥问题,AD转换这块你使用断点调试,看一下寄存器ADC12MEM0-2转换值是否正确,average0-2这几个数是否被正确显示。另外,在处理键值的时候建议使用switch语句。
TI中文支持网



