想通过中断方式(1.25ms中断采样一次,每次4个采样点便以滤波,每个电源周波20ms采样16次,最后求得交流220V电压的有效值,并在LCD显示出来)来进行AD采样,下面是部分关于AD的程序,可是LCD上显示的电压值从220V开始有规律的递增到270多伏又有规律的递减回220V,在codewarrior里面看到的AD转换结果也是变化的。用万用表量的的AD输入电压都是恒定的,虽然量的是平均值。请高手指教问题出在哪里?
void main(void)
{
uchar ftoustr[7]; //定义一个浮点型转换为整型后的数组
EnableInterrupts;
asm_main(); /* call the assembly function */
MCU_Initial();
LCD_Initial();
AD_Initial();
for(;;)
{
FloatToString(Vai,2,ftoustr); //对采样的电压值由浮点型的转换为字符型的
Disp(ftoustr,3,0); //由LCD显示压值
}
}
void AD_Initial(void) //AD初始化
{
MCCTL=0xC6; //模数递减计数器中断使能,连续中断,允许工作,
MCCNT=1250; //总线频率为8M,预分频因子为8 11000110,计数1250次,
//t =1us*1250=1.25ms 产生1次中断
ATD0CTL2 = 0x80; //AD0正常工作模式,中断下继续运行,禁止ATD中断
ATD0CTL3 = 0x00; //八通道,背景后激活继续转换
ATD0CTL4 = 0x01; //转换结果为10位,两个采样时间,4分频
//ATD0CTL5 = 0x90; //转换结果右对齐,无符号;多通道,单次转换
//ATD0CTL5 = 0xB0; //转换结果右对齐,无符号;多通道,多次转换
ATD1CTL2 = 0x80; //AD1正常工作模式
ATD1CTL3 = 0x00; //八通道转换
ATD1CTL4 = 0x01; //转换结果为10位
//ATD1CTL5 = 0x90; //转换结果右对齐,无符号;多通道,单次转换
//ATD1CTL5 = 0xB0; //转换结果右对齐,无符号;多通道,多次转换
}
void ISR_MDCU(void) //1.25ms模数计数器中断一次进行AD采样,
{ //中断16次(20ms一个电源周波)计算一次
uchar i;
// uint VolAi_AD0[4]; //VolAi_AD0存放A相输入电压值4个采样值,用来滤波
Sample_N++;
MCFLG_MCZF=1; //清除模数计数器中断标志位,这样可以重新计时
for(i=0;i
{
ATD0CTL5 = 0x90; //AD0转换开始
while (ATD0STAT0_SCF==0) //AD0转换完毕
{}
ATD1STAT0_SCF=1;//清除AD0转换完毕标志位
VolAi_AD0=ATD0DR0; //VolAi_AD0存放A相输入电压值4个采样值
}
Vai_ave = Vai_ave + Filter(VolAi_AD0);//Filter(VolAi_AD0)为冒泡排序的滤波子程序
if(Sample_N == 16)
{
//采样16次到,求各个采样值的有效值
Vai = Vk*Vai_ave; //对采样滤波后的AD值乘以一个系数,得到220V交流电压值
Sample_N = 0;
Vai_ave = 0;
}
} |