搜索
bottom↓
回复: 5

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

[复制链接]

出0入0汤圆

发表于 2009-8-26 14:26:34 | 显示全部楼层 |阅读模式
小弟最近在做一个简单的任务,需要先测试,用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[0] = ADCL;                //read ADCL first,or there will be a trouble
        dc_buffer[1] = ADCH;
         
          usart_putchar(adc_buffer[1]);     
          usart_buffer[0] =  usart_waitchar( );
          usart_putchar(adc_buffer[0]);
          usart_buffer[1] =  usart_waitchar( );
         
          OCR1AH = usart_buffer[1];
          OCR1AL = usart_buffer[0];
         
               
        // 启动下一次ADC采样
        ADCSRA |= (1<<ADSC);        //adc  sample frequecy is the same as LRclk
                  
}

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

#pragma vector=TIMER0_COMP_vect
__interrupt void irqHandler(void)           //比较中断,AD采样数据   64khz
{
       
          adc_buffer[0] = ADCL;                //read ADCL first,or there will be a trouble
          adc_buffer[1] = ADCH;
         
         
         
          OCR1AH = adc_buffer[1]
          OCR1AL = adc_buffer[0]
         
               
          // 启动下一次ADC采样
        ADCSRA |= (1<<ADSC);        //adc  sample 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 from  PC
{
  int c;
  while((c=usart_getchar())==-1);
  return (char)c;
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2009-8-26 18:15:41 | 显示全部楼层
晚上回去上图。奇怪奇怪

出0入0汤圆

 楼主| 发表于 2009-8-27 09:18:37 | 显示全部楼层

输入1K 正弦时的严重失真 (原文件名:p_large_novp_51fd000883952d14.jpg)

出0入0汤圆

 楼主| 发表于 2009-8-27 09:20:56 | 显示全部楼层

输入100HZ 信号,波形还好,就是有些高频波没虑掉 (原文件名:p_large_NsXG_51fd000883922d14.jpg)


输入300HZ,开始失真 (原文件名:p_large_1zFD_51fd000883932d14.jpg)

出0入0汤圆

 楼主| 发表于 2009-8-27 09:41:29 | 显示全部楼层
问题找到了,还是别人指点的,我忽视了串口的速度,寒,以为38400的波特率就够了,还是两个停止位,晕了,每秒串口只能传送 3.8K的字节,而我的AD采样率居然高到 64K ,傻不拉几的,程序根本处理不过来。接下来提高波特率降低采样率试试。

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

出0入0汤圆

 楼主| 发表于 2009-8-27 12:05:38 | 显示全部楼层
问题解决了,看来自己分析问题的能力要加强,自己顶下继续努力。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-15 21:49

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表