AVR 328pb定时器0基本介绍和使用

AVR 328pb定时器0基本介绍和使用


  • 📌参考ATmega328PB文档.

  • 📍结合参考同架构lgt8f328p中文文档:http://www.prodesign.com.cn/wp-content/uploads/2023/03/LGT8FX8P_databook_v1.0.4.pdf

  • 📄定时器基本信息:

Timer0/2: 8-Bit timer
Timer1/3/4: 16-Bit timer

📗定时器0基本功能描述

  • 🍃两个独立的输出比较单元
  • 🍃双缓冲输出比较寄存器
  • 🍃比较匹配发生时自动清零计数器并自动加载.(自动重装载)
  • 🍃无干扰脉冲的相位修正的PWM输出。
  • 🍃三个独立的中断源:溢出和比较匹配中断 (TOV0、OCF0A和OCF0B)

📑TC0寄存器列表

在这里插入图片描述

  • 🌿TC0控制寄存器A- TCCR0A
    在这里插入图片描述
    在这里插入图片描述
  • 🌿TC0控制寄存器B- TCCR0B
    在这里插入图片描述
    在这里插入图片描述
  • 🌿波形生成模式位(WGM0[1:0])描述:
    在这里插入图片描述

📘定时器0工作模式

定时计数器0有四种不同的工作模式,包括普通模式(Normal),比较匹配时清零(CTC)模式,快速脉冲宽度调制(FPWM)模式和相位修正脉冲宽度调制(PCPWM)模式,由波形产生模式控制位WGM0[2:0]来选择。

  • 🌿328PB定时器0架构
    在这里插入图片描述
🌿相位修正PWM模式
  • 时序图:
    在这里插入图片描述

当设置WGM0[2:0]=1 或 5 时,定时计数器 0 进入相位修正PWM模式,计数的最大值TOP 分别为MAX(0xFF)或OCR0A。计数器采用双向操作,由BOTTOM递增到TOP,然后又递减到BOTTOM,再重复此操作。计数到达TOP和BOTTOM时均改变计数方向,计数值在TOP或BOTTOM 上均只停留一个计数时钟。在递增或递减过程中,计数值TCNT0与OCR0x匹配时,输出比较信号OC0x将会被清零或置位,取决于比较输出模式COM0x的设置。与单向操作相比,双向操作可获得的最大频率要小,但其极好的对称性更适合于电机控制。

  • 相位修正PWM模式下,当计数到达BOTTOM时置位TOV0标志,当计数到达TOP时把比较缓冲器的值更新到比较值。如果中断使能,在中断服务程序中可以更新比较缓冲器OCR0x寄存器。
    设置OC0x 引脚的数据方向寄存器为输出时才能得到输出比较信号OC0x的波形。波形的频率可用下面的公式来计算:
FOCnxPCPWM = Fclk /N*510 (N由CS0[2:0] 决定)

其中,N表示的是预分频因子(1,8,64,256或者1024)。
在这里插入图片描述

在递增计数过程中,当TCNT0与OCR0x匹配时,波形产生器就清零(置位)OC0x信号。在
递减计数过程中,当TCNT0与OCR0x匹配时,波形产生器就置位(清零)OC0x信号。由此OCR0x 的极值会产生特殊的PWM波。当OCR0x设置为最大值或最小值时,OC0x信号输出会一直保持低电平或高电平。
为了保证输出PWM波在最小值两侧的对称性,在没有发生比较匹配时,有两种情况下也会翻转OC0x信号。第一种情况是,当OCR0x的值由最大值0xFF改变为其他数据时。当OCR0x为最大值,计数值达到最大时,OC0x 的输出与前面降序计数时比较匹配的结果相同,即保持OC0x不变。此时会更新比较值为新的OCR0x的值(非0xFF), OC0x的值会一直保持,直
到升序计数时发生比较匹配而翻转。此时OC0x信号并不以最小值为中心对称,因此需要在TCNT0 到达最大值时翻转 OC0x 信号,此即没有发生比较匹配时翻转 OC0x 信号的第一种情况。第二种情况是,当TCNT0从比OCR0x 高的值开始计数时,因而会丢失一次比较匹配,从而引起不对称情形的产生。同样需要翻转OC0x信号去实现最小值两侧的对称性。

  • 📝相位修正PWM模式测试例程:
/*
 * Timer0_ OC0A_PWM_Pulse.c
 *
 * Created: 2024/2/1 10:45:11
 * Author : Administrator
 */

#include <avr/io.h>



void Sys_Clock_Init(void)
{
   

// Crystal Oscillator division factor: 1 PSC  16MHz HSE
    CLKPR=(1<<CLKPCE);
    CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);

}

void Gpio_Init(void)
{
   

    // Port D initialization  PD6 PD5 OutPut
    // Function: Bit7=In Bit6=Out Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
    DDRD=(0<<DDD7) | (1<<DDD6) | (1<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
    // State: Bit7=T Bit6=0 Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
    PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);

}

void Timer0_PWM_Init(void)
{
   
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 250.000 kHz、
// Mode: Phase correct PWM top=0xFF
// OC0A output: Non-Inverted PWM
// OC0B output: Disconnected
// Timer Period: 2.04 ms
// Output Pulse(s):
//Phase Correct PWM Mode PWM频率
// OC0A Period: 2.04 ms Width: 1.024 ms
//N represents the prescale divider (1, 8, 64, 256, or 1024)
//1 PSC->62.5khZ
//FOCnxPWM = Fclk /N*510 (N由CS0[2:0] 决定)
    /*
        TCCR0A=(1<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (1<<WGM00);//250KHz
        TCCR0B=(0<<WGM02) | (0<<CS02) | (1<<CS01) | (1<<CS00);//64PSC :PWM频率= 1600 000/64*510
    */
    TCCR0A=(1<<COM0A1) | (0<<COM0A0) | 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值