简介
本文是针对STC32G系列单片机16位高速PWM 输出的代码总结,其中包括如何使能PWM输出、使能互补输出、定义端口输出,死区、频率和占空比的设置。
代码
以下代码是对于STC32G12K128单片机的PWM输出代码,但对于STC32G系列单片机,这些参数都可套用和设置。PWM参数其中包括自定义占空比和频率输出 ,P2.0 、P2.1输出互补PWM、死区为0。
#include <STC32G.H>
#define u8 unsigned char
void IO_Init(void)
{
EAXFR = 1; //使能访问 XFR
WTST = 0x00; //赋值为 0 可将 CPU 执行程序的速度设置为最快
P4M1=0x00;P4M0=0x00; // 配置IO口 设置为准双向口
P2M1=0x00;P2M0=0x00;
P0M1=0x00;P0M0=0x00;
P3M1=0x00;P3M0=0x00;
P1M1=0x00;P1M0=0x00;
}
void PWM_Init(void)
{
PWMA_CCER1 =0x00;
PWMA_CCMR1 = 0x60;
PWMA_CCER1 =0x05;
PWMA_DTR=0X00;
PWMA_PS=0X01;
PWMA_ENO =0x03;
PWMA_BKR =0x80;
PWMA_CR1 =0x01;
}
void pwmupdate(float D,float F)
{
PWMA_ARRH = (12000.0/F)/256.0;
PWMA_ARRL = (unsigned int)(12000.0/F)%256;
PWMA_CCR1H=((12000/F)*D)/256;
PWMA_CCR1L=(unsigned int)((12000/F)*D)%256;
}
说明
STC32G系列代码大部分都是通过对寄存器进行操作以及C语言的结合,虽不如STM32系列可通过HAL库进行操作,但是对于新手刚接触单片机,由51单片机向STM32系列的一个很好的产品,可以很好的理解一些寄存器操作和内容,其中抗干扰性还是不错的。
PWMA_CCER1 =0x00;
PWMA_CCER1寄存器中的捕获/比较输出使能位(CC1E)用于启用或禁用特定的PWM通道。当设置为1时,允许捕获计数器的值到捕获寄存器中,或者允许比较输出。注意的是写CCMR1前必须先清零CC1E关闭通道,即可让PWMA_CCER1 =0x00; 当设置完CCMR1后再设置其通道PWMA_CCER1 =0x05;为配置输出比较通道(即输出互补PWM)若为0X01为使能CC1通道(即输出一路PWM),本文设置的是输出两路互补PWM。
PWMA_CCMR1 = 0x60;
PWMA_CCMR1 为配置PWM的输出模式,本次设置的为模式一
PWMA_DTR=0X00;
当设置为输出两路互补PWM时可设置PWMA_DTR寄存器来配置死区时间,本文是设置为0。具体时间设置参考:
死区设置
PWMA_ENO =0x03;
PWM_ENO配置输出通道使能,本文使能的是PWMA1P PWMA1N,具体通道输出使能如下:
PWMA_BKR =0x80;
PWMA_CR1 =0x01;
PWMA_BKR =0x80; 为使能主输出 PWMA_CR1 =0x01;开始计时
PWMA_PS=0X01;
此寄存器可以对输出PWM的通道进行选择,初始通道为P1.0,即PWMA_PS=0X00。如果使能了捕获输出(即PWM波互补输出),初始通道则为P1.0、P1.1,值得注意的是其中占空比改变的是PWM1P,而PWM1N则是互补输出。
输出通道选择
PWMA_ARRH = (12000.0/F)/256.0;
PWMA_ARRL = (unsigned int)(12000.0/F)%256;
PWMA_CCR1H=((12000/F)*D)/256;
PWMA_CCR1L=(unsigned int)((12000/F)*D)%256;
PWMA_ARRH 、PWMA_ARRL 分别为配置PWM频率的高八位和低八位,F为设置PWM的频率,单位为KHZ;PWMA_CCR1H 、 PWMA_CCR1L分别为配置PWM占空比的高八位和低八位,D为设置PWM的占空比,范围为0-1。
总结
本文将STC32 PWM输出的频率和占空比封装成了一个函数,为后续调用输出。值得注意的是在使用该函数时,必须先初始化IO口和PWM的初始化。同时想更加详细了解请看STC32手册,谢谢。
(注:不喜白嫖,如对你有帮助请不吝啬您的点赞收藏+关注,如有错误,请批评校正)