打印
[C语言]

如何让AVR单片机产生两路频率占空比一样的PWM输出

[复制链接]
2797|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Easy_Deng|  楼主 | 2014-4-13 13:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
采用atmega16单片机,按照书上的例子把寄存器开了,但是示波器观察不到两路,只有一路
#include<iom16v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
uint num;

//*******延时函数*******//
void delay(uint MS)  //约为1MS的延时函数                  
{
uint i,j;
for(i=0;i<MS;i++)
for(j=0;j<1141;j++);       //1141是在8MHz晶振下为MS毫秒
}

//******PWM初始化******//
void KPWM(unsigned char fcq,unsigned char rat)
{
uint f,r;
DDRD|=0X30;   //设置PD4 PD5为第二功能脚 分别为OC1B OC1A
TCCR1A=0XA3;  //两路PWM,匹配清零
TCCR1B=0X19;  //在这决定了1分频 快速PWM模式

f=16000/fcq;  //计算最大值和比较值
f=f/1;
f=f-1;
r=f;
r=r/10;
r=r*rat;
r=r/10;
  
OCR1A=f;      //频率值  
OCR1B=r;      //占空比值
}

//*********主函数*********//
void main()
{
  while(1)
  {
  KPWM(250,32);
  }
}

相关帖子

沙发
coody| | 2014-4-13 15:58 | 只看该作者
频率占空比都相同,做一路不就得了?

使用特权

评论回复
板凳
airwill| | 2014-4-13 21:11 | 只看该作者
选的模式不对, 可以用 ICR 做 TOP 的模式(具体模式不记得了), 试试吧, 应该能够实现
ICR1=f;
OCR1A=OCR1B=r;      //占空比值

使用特权

评论回复
地板
huangxz| | 2014-4-13 22:29 | 只看该作者
你的初始化不要放在主循环里面吧

使用特权

评论回复
5
Easy_Deng|  楼主 | 2014-4-16 18:42 | 只看该作者
airwill 发表于 2014-4-13 21:11
选的模式不对, 可以用 ICR 做 TOP 的模式(具体模式不记得了), 试试吧, 应该能够实现
ICR1=f;
OCR1A=OCR1B= ...

嗯,模式选错了,谢谢,现在问题解决了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

27

帖子

1

粉丝