这是第一次用MO51通过寄存器的方法来操作PWM整了好久
/*************************************************************
* 用操作寄存器的方法设置PWM
*使能PWM的死区设置PWMO和PWM1为一对互补对,可调整死区时间,频率和占空比课自己设定,灵和性大
**************************************************************/
#include "DrvPWM.h"
#include "DrvGPIO.h"
#include "DrvSYS.h"
#include "SysInfra.h"
#include "ModuleID.h"
#define CLK 12000000 //ext_clok
#define Deadtime 20
void Init_sys(void)
{
UNLOCKREG(); //寄存器锁定地址寄存器
DrvSYS_SetOscCtrl(E_SYS_XTL12M,1); //使能12M crystal
/* Waiting for 12M Xtal stalble */
DrvSYS_Delay(5000);
LOCKREG(); //向“0x5000_0100”写入任何值,可以重锁保护寄存器
}
/*************************************************************
* PWM Initialization Code Template这个产生的频率在3M以下
**************************************************************/
void Init_pwm(double Fre,double Duty)
{
Init_sys();
/* Enable PWM clock */
DrvPWM_Open();
DrvPWM_SelectClockSource(DRVPWM_TIMER0, DRVPWM_EXT_12M);
/*以下是对PWMO的寄存器设置*/
PWMA->PPR.CP01=1; //divider 1 f=PWMxy_CLK/((prescale+1)*(clock divider)*(CNR+1))
PWMA->CSR.CSR0=0b100;//prescale 1
PWMA->PCR.CH0INV=0;//Inverter close
DrvPWM_EnableDeadZone(DRVPWM_TIMER0, Deadtime, 1);//deadtime set
PWMA->PCR.CH0MOD=1;//function model auto_reload
PWMA->PCR.CH0EN=0;//close pwm_timer
PWMA->CNR0=(uint16_t)(CLK/(2*Fre)-1); //set duty 50% set frequence
PWMA->CMR0=(uint16_t)((Duty*(PWMA->CNR0+1)/100.0)-1);//set duty
PWMA->PIER.PWMIE0=0;//start Pwm_timer
DrvGPIO_InitFunction(E_FUNC_PWM01);
DrvPWM_SetTimerIO(DRVPWM_TIMER0, 1);
/* Enable in/out for PWM Timer1 */
DrvPWM_SetTimerIO(DRVPWM_TIMER1, 1);
/* Enable the PWM Timer 1 */
DrvPWM_Enable(DRVPWM_TIMER1, 1);
/* Enable the PWM Timer 0 */
DrvPWM_Enable(DRVPWM_TIMER0, 1);
//PWMA->PCR.CH0EN=1;
}
int main(void)
{
Init_pwm(10000,30);
while(1)
{
;
}
}
|