AVR PWM 都用到那个引脚了

作者&投稿:夏伯 (若有异议请与网页底部的电邮联系)
怎么设置avr单片机的pwm引脚?~

我有例程供参考,用的是CVAVR
PORTD=0x00;
DDRD=0xB0; // 三路pwm输出

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 14.400 kHz
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x05;
TCNT0=0x70;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 14745.600 kHz
// Mode: Fast PWM top=01FFh
// OC1A output: Non-Inv.
// OC1B output: Non-Inv.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0xA2;
TCCR1B=0x09;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00; // ---------------------PUMP DRV---------------------- OCR1A
OCR1BH=0x00;
OCR1BL=0x00; // ---------------------COOL DRV---------------------- OCR1B
// 然后改变 OCR1A,OCR1B 的数值就可以改变占空比了
这些都可以在IDE设置向导里自动完成。

  AVR单片机TC0快速PWM

  PWM:脉冲宽度调制,图中T为脉冲周期,t为高电平时间,t与T的比值t/T称为占空比,脉宽调制指的是调整t的大小,即改变脉冲的占空比,占空比值越大,输出的电压越高。改变占空比就改变输出的电压,常用于实现D/A,调节电压或电流,改变电动机的转速等。
  快速PWM模式:它的计数方式是TCNT0由0开始计数到255式,计数加1返回到0,然后继续加1计数,相对于相位PWM修正模式(由0计数到255,再从255计数到0),只有一个斜坡,因此PWM输出频率高。在快速PWM模式下,计数器的最大值决定了PWM的频率,而比较寄存器OCR0决定了占空比的大小。T/C0是8位计数器, 输出PWM的频率=系统时钟频率/(分频系数*255) 。

  PWM产生过程:定时器启动后,当TNCT0和OCR0的值相等时,输出引脚OC0(PB3)清0,当TNCT0到255时OC0置位,在程序运行过程中改变OCR0中的数值,就改变了OC0输出的占空比。

  //函数功能:控制PB3引脚上的发光二极管由亮到灭,再由灭到亮 (代码来自轻松玩转AVR单片机c语言cd)

  #include

  #define uchar unsigned char

  #define uint unsigned int

  unsigned int count;

  /*********以下是延时函数*********/

  void Delay_ms(uint xms)

  {

  int i,j;

  for(i=0;i

  { for(j=0;j<1140;j++) ; }

  }

  /********以下是端口初始化函数********/

  void port_init()

  {

  DDRB|=(1<

  PORTB&=(0<

  }

  /********定时器0初始化********/

  void timer0_init()

  {

  TCCR0=(1<

  // T/C0工作于快速PWM模式,不分频

  //比较匹配时,OC0置位,记数到0XFF时,清零OC0

  OCR0=0; //比较匹配寄存器初值,

  SREG=0x80; //使能全局中断

  }

  /*********以下是主函数*********/

  void main(void)

  {

  port_init();

  timer0_init();

  while(1)

  {

  for(count=0;count<256;count++) //OCR=0时,LED最亮,然后逐渐变暗

  {

  OCR0=count; //比较匹配寄存器赋值

  Delay_ms(20); //延时一段时间,以观察效果

  }

  Delay_ms(3000); // LED最暗时,延时一段时间

  for(count=255;count>0;count--) //OCR=255时,LED最暗,然后逐渐变亮

  {

  OCR0= count;

  Delay_ms(20);

  }

  Delay_ms(3000); //LED最亮时,延时一段时间

  }

  }

  //目标系统: 基于AVR单片机
  //应用软件: ICC AVR

  /*01010101010101010101010101010101010101010101010101010101010101010101
  ----------------------------------------------------------------------
  实验内容:
  AVR内部脉宽调制输出实验,用LED指示PWM的频率,在PWM速度较低时,可观察到LED的闪烁。
  ----------------------------------------------------------------------
  硬件连接:
  将UserLed指示灯连接至PWM的端口PB3/OC0。
  ----------------------------------------------------------------------
  注意事项:
  (1)若有加载库程序,请将光盘根目录下的“库程序”下的“ICC_H”文件夹拷到D盘
  (2)请详细阅读:光盘根目录下的“产品资料开发板实验板SMK系列SMK1632说明资料”
  ----------------------------------------------------------------------
  10101010101010101010101010101010101010101010101010101010101010101010*/

  #include <iom16v.h>
  #include <macros.h>

  #define OC0_OUT_EN DDRB |= 0b00001000

  /*--------------------------------------------------------------------
  程序名称:定时器0初始化程序
  程序功能:定时器作PWM使用,设置PWM的工作模式
  注意事项:
  提示说明:
  输 入:
  返 回:
  --------------------------------------------------------------------*/
  void timer0_init(void)
  {
  TCCR0 = (1<<WGM01)|(1<<WGM00)|(1<<COM01)|(1<<COM00)|(1<<CS00);
  /*
  WGM01=1; WGM00=1; --> fast PWM modle
  COM01=1; COM00=0; --> 比较匹配时set OC0 pin
  CS00=1; --> timer0 source 不经过任何分频,直接为Clk,使得PWM可以工作得足够快
  */
  TCNT0 = 0x00; //设置TC0计数寄存器初值
  OCR0 = 0x10; //输出比较寄存器初值,设置该值可用于调节OC0输出占空比
  }
  /*--------------------------------------------------------------------
  程序名称:
  程序功能:
  注意事项:
  提示说明:
  输 入:
  返 回:
  --------------------------------------------------------------------*/
  void main(void)
  {
  OC0_OUT_EN; //为允许PWM工作,需设置PB3为输出
  timer0_init();
  SEI();
  while(1);
  }

  系统调试

  改变PWM初始化代码的如下两个语句的赋值:

  TCNT0 = 0x00; //设置TC0计数寄存器初值
  OCR0 = 0x10; //输出比较寄存器初值,设置该值可用于调节OC0输出占空比

  从LED的闪烁频率可以看出,改变了PWM的频率。

看OCn的引脚即是

数据手册说的很清楚


怀集县18554163350: avr单片机每个io口都能用定时器输出pwm吗 -
牧娴先强: 只要有定时器,理论上任何单片机的IO口都可以的产生PWM,只要写入正确的程序,只是效果嘛,我觉得还是买个现成的PWM芯片才是正道......AVR有PWM功能,有专门的PMW输出引脚,能够硬件实现,所以你完全没必要用其他引脚来软件实现....至于其他单片机的,这种东西完全看型号了,每种单片机都有N种型号,有的有,有的没有,萝卜白菜还分三六九等那,就算没有某种功能也不代表不能软件实现,PWM就能软件实现....

怀集县18554163350: 基于AVR的PWM测试程序 -
牧娴先强: //PD5和PD4分别接1个LED看效果#include int main(void){ DDRD=0x30; //OC1A(PD5)和OC1B(PD4)两引脚作输出用 ICR1=F_CPU/256-1; //周期是1秒OCR1A=F...

怀集县18554163350: avr单片机 pwm功能 -
牧娴先强: AVR单片机TC0快速PWMPWM:脉冲宽度调制,图中T为脉冲周期,t为高电平时间,t与T的比值t/T称为占空比,脉宽调制指的是调整t的大小,即改变脉冲的占空比,占空比值越大,输出的电压越高.改变占空比就改变输出的电压,常用于实...

怀集县18554163350: 51单片机怎样做PWM -
牧娴先强: 你用定时器开中断吧,如果只是简单的用IO口的话,得到的频率很不准确的!思路:根据单片机的晶振大小计算定时器的初值,在中断程序里给对要输出脉冲的引脚取反操作就是了,例如:P1^0=~P1^0; 还有脉冲频率不能太高哦,要保证定时器的计时时间大于中断程序执行时间~~ 程序大体结构: void Init_timer() //定时器初始化 { } void main() //主程序 { } void t0() interrupt 1//t0的中断程序{ }

怀集县18554163350: avr单片机pwm模式下输出比较寄存器的值怎样的到的
牧娴先强: 者清零来达到输出脉冲的目的. 如: 10ms的定时中断,当第一次中断来时,在PA0上输出高电平; 第二次中断时,在PA0上输出低电平; 这样就可以输出频率一定,占空比也一定的脉冲串或者单片脉冲(如检测某个状态,当符合时,才输出...

怀集县18554163350: 51单片机和AVR单片机的区别 -
牧娴先强: 这个区别不少,最主要的当然是寄存器和IO端口啦! avr在51的基础上扩充了大量的寄存器和大量的引脚功能,几乎每个引脚都有第二功能,还有如:4路PWM波的输出、I^2C总线等(不用像51那样模拟I^2C了)(在学的过程中自然会明白的,这里不多说). 在端口设置时,avr还要设置是输入还是输出,是上拉电阻还是非上拉电阻等. 总之要是学会了51,avr真的是再简单不过了,都是一个模式.我学avr才用了2、3天,当然是学了51后啦!就不多说了,好好学习,为中国电子产业做点贡献啊!

怀集县18554163350: 单片机有内置的AD PWM Flash -
牧娴先强: 其实所有厂商的单片机 都有带这些的型号~ 比如 STC5A60S2 Mega128 MSP430(149) ARM(LPC2138 STM32F103) 我说的可都是在中国使用及其流行的哦 档次也越来越高 怎么说呢 其实硬件不复杂(如果片内集成再复杂 谁还集成?) 但是软件是这样的 内部的AD什么的你必须熟悉他的寄存器怎么怎么用 这个过程比较复杂 但是如果外接的话 基本都是IO口模拟时序 你只要会IO口 然后熟悉器件时序就行了 但是IO口模拟的方法普遍效率低下 且硬件成本高

怀集县18554163350: 使用avr 单片机 输出 PWM 波 要引入哪些头文件 -
牧娴先强: 补个icc的头文件 iom xx v.h xx是型号 macros.h pwm 的生成方法 io加延时 tc溢出中断 改io 占空比可变改tc初值 需外加计数变量 tc比较比较匹配 翻转 占空比50% 频率可改tc初值、匹配值 tc比较匹配中断 改io 占空比可变改tc初值、匹配值 需外加计数变量 频率可改 初值匹配值和 tc快速pwm 占空比可改匹配值 频率可改初值 tc修正pwm 占空比可改匹配值 频率可改初值

怀集县18554163350: 用过单片机pwm控制电机的进,怎样控制电机正反转,我是菜鸟,简单说下电路原理即可
牧娴先强: 单片机引脚一般不能直接连电机. 一般是控制电源的开关,直接给电机供电的还是电源的正负极,单片机只是控制这个回路的断开和导通.

怀集县18554163350: AVR单片机 ATmega169PV PWM输出2MHz 单片机内部晶振8MHz -
牧娴先强: 你试试这个代码,看能不能在PB7输出你需要的波形:PORTB=0x00; DDRB=0x80; ASSR=0x00; TCCR2A=0x19; TCNT2=0x00; OCR2A=0x03;

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网