搜索
bottom↓
回复: 13

ATmega16有没有可能产生两路16位PWM输出?

[复制链接]

出0入0汤圆

发表于 2008-6-15 03:34:34 | 显示全部楼层 |阅读模式
  课程设计中用PWM做输出控制比例阀,用ADC接收压力传感器的信号,可是测下来特性曲线不太好,可利用线性部分太窄(如图),所以想将现在8位的PWM改为16位,以提高精度。不知道,ATmega16有没有可能输出两路16位的PWM信号?

  OC1应该是可以的吧。OC0和OC2都是8位的,有没有办法把他们合并成16位的?

  谢谢!


(原文件名:adc-pwm.gif)

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2008-6-15 11:26:21 | 显示全部楼层
有OC1A与OC1B

出0入0汤圆

 楼主| 发表于 2008-6-17 00:42:23 | 显示全部楼层
OC1A和OC1B如果同时用的话,好像只能生成两路8位PWM信号吧;如果要16位的话,OC1A和OC1B只能一路输出吧。

以前好像看到过一个贴子,说是把OC0和OC2合起来当16为计数器用,就可以输出16位PWM信号了。可是这个贴子找不到了。

出0入0汤圆

发表于 2008-6-17 03:59:31 | 显示全部楼层
/*****************************************************
www.avrdiy.com     panxiaoyi
CodeWizardAVR V1.25.9 Professional
Chip type           : ATmega16L
Program type        : Application
Clock frequency     : 8.000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 256
*****************************************************/

#include <mega16.h>

void main(void)
{   

  TCCR1A = 0b10100010;   //快速PWM
  TCCR1B = 0b00011001;   //时钟1分频
  ICR1H  = 0xFF;         //TCNT计数上限(最高16位)
  ICR1L  = 0xFF;
  DDRD   = 0x30;         //PWM输出
  
  while (1)
  {  
  
    OCR1AH=0x7F;         //设置OCR0A的占空比1:2
    OCR1AL=0xFF;
   
    OCR1BH=0x3F;         //设置OCR0B的占空比1:4
    OCR1BL=0xFF;
   
  };
}

出0入0汤圆

发表于 2008-6-17 08:22:44 | 显示全部楼层
lz观点有误,M16可以产生2路16位pwm信号,只是频率相同。

出0入0汤圆

发表于 2008-6-17 18:42:41 | 显示全部楼层
【2楼】 chenglong 成龙

瞎讲,OC1A和OC1B同时产生PWM都是16位的
频率一致因为公用一个16位计数器
占空比可分别调节因为16比较寄存器有2套

出0入0汤圆

 楼主| 发表于 2008-8-7 05:38:32 | 显示全部楼层
本来以为没人回复了,家里又没网络,所以就没再来看。今天发现,还竟然有朋友把代码都贴出来了,真的是好感动。

非常感谢各位的帮助。我试一下,希望能够成功。

出0入0汤圆

 楼主| 发表于 2008-8-12 01:45:55 | 显示全部楼层
再次谢谢【3楼】 panxiaoyi 啊艺!


#include <stdlib.h>
#include <avr/io.h>

int pwm16_Init(unsigned char pwmbit)
{

        TCCR1A = 0b10100010;   //Fast PWM
        TCCR1B = 0b00011001;   //No prescaling
               

        unsigned int icr1_temp=0x0000;
        if (pwmbit>16) pwmbit=16;
        for (;pwmbit>0;pwmbit--)
                icr1_temp=icr1_temp+(1<<(pwmbit-1));
        ICR1=icr1_temp;
       
        DDRD   = 0x30;         //PWM Output
       
        OCR1A=0;
        OCR1B=0;
       
        return 0;

}

出0入0汤圆

发表于 2008-9-2 11:01:34 | 显示全部楼层
不错

出0入0汤圆

发表于 2008-9-2 11:22:35 | 显示全部楼层
好贴,收藏

出0入0汤圆

发表于 2010-8-8 10:59:16 | 显示全部楼层
MARK

出0入0汤圆

发表于 2012-7-13 10:39:10 | 显示全部楼层
学习学习

出0入0汤圆

发表于 2012-7-28 15:43:18 | 显示全部楼层
学习一下

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-7-24 04:20

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

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