晟矽微PWM案例分析

/******************************************************************************

;  *       @型号                 : 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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值