/******************************************************************************
; * @型号 : MC32F7361
; * @创建日期 : 2021.12.21
; * @公司/作者 : SINOMCU-FAE
; * @晟矽微技术支持 : 2048615934
; * @晟矽微官网 : http://www.sinomcu.com/
; * @版权 : 2021 SINOMCU公司版权所有.
; *----------------------摘要描述---------------------------------
; * 定时器0--PWM0
; * P02输出波形,F=10k,D=25%
******************************************************************************/
#include "user.h"
/************************************************
; * @函数名 : CLR_RAM
; * @说明 : 清RAM
; * @输入参数 :
; * @返回参数 :
; ***********************************************/
void CLR_RAM(void)
{
for (FSR0 = 0; FSR0 < 0xff; FSR0++)
{
INDF0 = 0x00;
}
FSR0 = 0xFF;
INDF0 = 0x00;
}
/************************************************
; * @函数名 : IO_Init
; * @说明 : IO初始化
; * @输入参数 :
; * @返回参数 :
; ***********************************************/
void IO_Init(void)
{
IOP0 = 0x00; //io口数据位
OEP0 = 0x3F; //io口方向 1:out 0:in
PUP0 = 0x00; //io口上拉电阻 1:enable 0:disable
PDP0 = 0x00; //io口下拉电阻 1:enable 0:disable
P0ADCR = 0x00; //io类型选择 1:模拟输入 0:通用io
IOP1 = 0x00; //io口数据位
OEP1 = 0xFF; //io口方向 1:out 0:in
PUP1 = 0x00; //io口上拉电阻 1:enable 0:disable
PDP1 = 0x00; //io口下拉电阻 1:enable 0:disable
P1ADCR = 0x00; //io类型选择 1:模拟输入 0:通用io
IOP2 = 0x00; //io口数据位
OEP2 = 0x0F; //io口方向 1:out 0:in
PUP2 = 0x00; //io口上拉电阻 1:enable 0:disable
PDP2 = 0x00; //io口下拉电阻 1:enable 0:disablea
PMOD = 0x00; //P00、P01、P13 io端口值从寄存器读,推挽输出
DRVCR = 0x80; //普通驱动
}
/************************************************
; * @函数名 : TIMER0_PWM_Init
; * @说明 : 定时器0,PWM初始化
; * @输入参数 :
; * @返回参数 :
; ***********************************************/
void TIMER0_PWM_Init(void)
{
//最上面为项目配置文件,FCPU是FHOSC的4分频,所以FCPU为32/4 = 8MHZ
T0CR = DEF_SET_BIT6 | DEF_SET_BIT0 | DEF_SET_BIT1; //使能PWM,CPU,8分频,DEF_SET_BIT6外使能PWN0功能
//T0定时器的频率为8/8 =1MHZ,运行一次是1US。这里设置了T0CNT为100,那么就是从100开始每隔1US就减一,也就是减100次,用时100US然后参数定时器中断。
T0CNT = 100-1;
T0LOAD = 100-1; //100us
//T0DATA是设置高电平在整个周期里面的时间,现在的周期是100,高电平是25,所以我们说的占空比就是25%。PWM经常控制LED灯的亮度,那么如果设置占空比为25%,那边灯亮度大概就是直接拉高亮度的25%左右。还有马达的转速等控制场景。
T0DATA = 25;
//控制位设置,下面规格书说明
PWMCR0 = 0x00; //正向输出
PWMCR1 = 0x00; //普通模式
PWMCR3 = DEF_SET_BIT2; //P02端口输出
T0EN = 1;
}
/************************************************
; * @函数名 : Sys_Init
; * @说明 : 系统初始化
; * @输入参数 :
; * @返回参数 :
; ***********************************************/
void Sys_Init(void)
{
GIE = 0;
CLR_RAM();
IO_Init();
TIMER0_PWM_Init();
GIE = 1;
}
/************************************************
; * @函数名 : main
; * @说明 : 主程序
; * @输入参数 :
; * @返回参数 :
; ***********************************************/
void main(void)
{
Sys_Init();
while (1)
{
}
}
/************************************************
; * @函数名 : interrupt
; * @说明 : 中断函数
; * @输入参数 :
; * @返回参数 :
; ***********************************************/
void int_isr(void) __interrupt
{
__asm
movra _abuf
swapar _PFLAG
movra _statusbuf
__endasm;
__asm
swapar _statusbuf
movra _PFLAG
swapr _abuf
swapar _abuf
__endasm;
}
/**************************** end of file *********************************************/
知识点:
定时器 T0 可实现 PWM 功能(PWM0),可通过寄存器位使能或关闭 PWM 功能,并控
制端口是否输出 PWM 波形。PWM0 关闭时 T0PWM 信号为低电平。PWM0 使能后 T0CNT 从重载值开
始递减计数直到计数溢出为一个 PWM 周期:当计数到与比较寄存器 T0DATA 相等时,T0PWM 变为高
电平;当计数溢出时,T0PWM 变为低电平。
T0DATA 配有 1 个 8 位比较缓冲器(T0DT_buf)用于与 T0CNT 比较,PWM0 关闭时写 T0DATA 将
立即载入缓冲器中,而 PWM0 使能后写 T0DATA 则将在 T0 溢出时才载入缓冲器中。若要首个 PWM 周
期和占空比准确,需先写重载寄存器和比较寄存器,再使能 PWM,最后开启定时器。
T0PWM 信号的占空比计算如下:
² 高电平时间 =(T0DATA)× T0CNT 计数时钟周期
² 周期(T0 溢出时间)=(T0LOAD + 1)× T0CNT 计数时钟周期
² 占空比(高电平时间/周期)=(T0DATA)/(T0LOAD + 1)