qiuxiangkai 发表于 2009-8-26 14:26:34

m128 AD采样经串口发送,再生成生成PWM经低通滤波器输出时碰见的奇怪问题 麻烦马老师

小弟最近在做一个简单的任务,需要先测试,用m128 10位 AD 采样,得到数字信号,然后将此信号经过串口发送和接受(自发自收),再将受到的数据送到PWM(10位)的OCR寄存器,以控制PWM的占空比,输出接个低通滤波,到到AD 采样端的原始信号,

一些主要的数据如下,用T0定时 器工作于自动装载的模式,中断频率为64K,在中断中实现AD 一次采样 并将 数据经后面处理,

现在问题出来了,我的AD采样与 写PWM的OCR寄存器的操作都放在中断里,如果是 直接把AD采样的值送到OCR寄存器中,则 低通滤波器输出的波形很好(输入信号1KHZ),和原始信号一致,但若将采样的数据通过串口自发自收后再写入OCR寄存器中,则输入信号在200HZ以上时输入波形严重失真,输入100 HZ 时输出波形则还不错

我用的是一阶的低通滤波器,R = 1K ,C =0.1uf   截止频率在1KHZ 附近。 pwm的最大频率为16KHZ

一下是部分主要程序,中断里的操作

#pragma vector=TIMER0_COMP_vect
__interrupt void irqHandler(void)           //比较中断,AD采样数据   64khz
{
       
        adc_buffer = ADCL;                //read ADCL first,or there will be a trouble
        dc_buffer = ADCH;
         
          usart_putchar(adc_buffer);   
          usart_buffer =usart_waitchar( );
          usart_putchar(adc_buffer);
          usart_buffer =usart_waitchar( );
         
          OCR1AH = usart_buffer;
          OCR1AL = usart_buffer;
         
               
        // 启动下一次ADC采样
        ADCSRA |= (1<<ADSC);        //adcsample frequecy is the same as LRclk
                  
}

我尝试过将串口收发程序放在主程序中处理,不见效。
不使用串口收发时收发则输出正常:

#pragma vector=TIMER0_COMP_vect
__interrupt void irqHandler(void)           //比较中断,AD采样数据   64khz
{
       
          adc_buffer = ADCL;                //read ADCL first,or there will be a trouble
          adc_buffer = ADCH;
         
         
         
          OCR1AH = adc_buffer
          OCR1AL = adc_buffer
         
               
          // 启动下一次ADC采样
        ADCSRA |= (1<<ADSC);        //adcsample frequecy is the same as LRclk
          
       
}
已排除是滤波器的问题,看来应该就是串口收发的问题了,是不是因为在处理数据的顺序上不合理而导致?
收发均采用轮询方式,参照马老师的程序

void usart_putchar(unsigned char c)
{
        while(!(UCSR0A & 0x20));
        UDR0 = c;
}
   
int usart_getchar(void)
{
        unsigned char status,res;
        if(!(UCSR0A & 0x80)) return -1;      //no data to be received
        status = UCSR0A;
          res = UDR0;
        if (status & 0x1c) return -1;      // If error, return -1
        return res;
}       

char usart_waitchar(void)                 //receive an efficient char fromPC
{
int c;
while((c=usart_getchar())==-1);
return (char)c;
}

qiuxiangkai 发表于 2009-8-26 18:15:41

晚上回去上图。奇怪奇怪

qiuxiangkai 发表于 2009-8-27 09:18:37

http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_475128.jpg
输入1K 正弦时的严重失真 (原文件名:p_large_novp_51fd000883952d14.jpg)

qiuxiangkai 发表于 2009-8-27 09:20:56

http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_475129.jpg
输入100HZ 信号,波形还好,就是有些高频波没虑掉 (原文件名:p_large_NsXG_51fd000883922d14.jpg)

http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_475130.jpg
输入300HZ,开始失真 (原文件名:p_large_1zFD_51fd000883932d14.jpg)

qiuxiangkai 发表于 2009-8-27 09:41:29

问题找到了,还是别人指点的,我忽视了串口的速度,寒,以为38400的波特率就够了,还是两个停止位,晕了,每秒串口只能传送 3.8K的字节,而我的AD采样率居然高到 64K ,傻不拉几的,程序根本处理不过来。接下来提高波特率降低采样率试试。

看来分析问题的能力有待加强。

qiuxiangkai 发表于 2009-8-27 12:05:38

问题解决了,看来自己分析问题的能力要加强,自己顶下继续努力。
页: [1]
查看完整版本: m128 AD采样经串口发送,再生成生成PWM经低通滤波器输出时碰见的奇怪问题 麻烦马老师