我自己写了个149的adc12单通道序列转换的程序,使用的是p6.0(A0通道),结果现象正确,可是吧程序中控制A0通道的寄存器参数改成对应的控制p6.1的A1通道的寄存器参数,其余地方不动,结果转换的结果不对。其中A1输入一个模拟电压转换的结果数字不变。有时候还出现一些随机数字,请问什么原因。
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
我自己写了个149的adc12单通道序列转换的程序,使用的是p6.0(A0通道),结果现象正确,可是吧程序中控制A0通道的寄存器参数改成对应的控制p6.1的A1通道的寄存器参数,其余地方不动,结果转换的结果不对。其中A1输入一个模拟电压转换的结果数字不变。有时候还出现一些随机数字,请问什么原因。
ADC修改的时候一个是ADC12INCH通道修改,一个是转换值ADC12MEMx的修改,您的问题肯定是由于ADC寄存器修改的地方不对导致的,建议再检查一下代码。
//*****此程序实现的是以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) ;
}
}
把你错误代码贴出来。
我下面这段代码是基于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;
}
}
大概看了你的代码,AD这块没看出啥问题,AD转换这块你使用断点调试,看一下寄存器ADC12MEM0-2转换值是否正确,average0-2这几个数是否被正确显示。另外,在处理键值的时候建议使用switch语句。