标题:
AD 转换结果乱跳问题
[打印本页]
作者:
lihenshui
时间:
2007-6-26 16:07
标题:
AD 转换结果乱跳问题
想通过中断方式(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;
}
}
作者:
strongchen
时间:
2007-6-26 16:57
首先你要确定1.25mS的定时是否准确。其次,你为何要采用单次8通道转换模式,而不采用4次单通道采样模式?另外,你贴出的程序这一段好像有问题:
for(i=0;i {
ATD0CTL5 = 0x90; //AD0转换开始
while (ATD0STAT0_SCF==0) //AD0转换完毕
{}
ATD1STAT0_SCF=1;//清除AD0转换完毕标志位
VolAi_AD0
=ATD0DR0; //VolAi_AD0存放A相输入电压值4个采样值
}
作者:
lihenshui
时间:
2007-6-27 18:16
版主好:
问题是这样的:
目前暂时按照单相来设计,只需检测三个AD量就行了(三相的会有9路要检测,三相的输入输出电压和电流),故在初始化的时候就8路全部检测了,也可以为了节约时间不这么设置。目前我已经将ATD0CTL3 = 0x08; //二通道转换
ATD0CTL5 = 0x90; //转换结果右对齐,无符号;多通道,只转换AN0和AN1,单次转换
另外还有一个问题请教:手册上说的那个处于扫描方式下的第一序列转换后ATDSTAT_SCF置位,如果我想对两个通道连续采样四个点以方便滤波,该怎么设置?
我上面的做法是非扫描方式,在中断中做个循环4次的采样,保存后再处理,我可是我觉得这样很罗嗦浪费时间;若设置为扫描方式,多通道连续转换,我怎么才能连续的读出每个采样通道的四个点值?请版主给与指点 我的QQ41998417
另外:显示值乱跳的问题暂时解决,主要是我的电流互感器原边电流过大,输出端波形已经畸变,换了个大的电阻好了。。。谢谢帮助。
作者:
strongchen
时间:
2007-6-28 10:53
AD转换时要么采用单次转换,要么采用连续转换,即SCAN模式,并不能规定SCAN的次数,这必须由软件来控制。
作者:
lihenshui
时间:
2007-6-30 21:27
再问:如果中断来了,采用SCAN模式的话,如何才能读到每个通道连续的四个采样值?SCAN模式下当第一个序列转换完毕后SCF置位,那么接下来的第二个、第三个等等的转换序列转换完毕后如何去判断转换完毕?手册看的不是很明白,请赐教。。。《摩托罗拉68HC12系列微控制器原理、应用与开发技术》这本书上关于AD转换部分207页的对于状态寄存器的SCF位的那一段解释不是很明白
作者:
zhuifengzm
时间:
2007-7-1 21:49
根据ATD0START0和ATD1START0的标志位去判断
作者:
strongchen
时间:
2007-7-2 11:27
不管是否处于SCAN模式,当每个转换序列转换完成时SCF都会置位。而且一个序列的转换结果会依次存放于8个结果寄存器中。
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0