PWM应用程序
/*
程序实现功能:PP1口输出PWM方波
程序说明:通过改变duty和period ,从而控制PWM周期和占空比
duty cycle=duty/period
PWM frequency=1M/(2*period)(Fbus=24M,scla=24)
*/
#include 《hidef.h》 /* common defines and macros */
#include “derivative.h” /* derivative-specific definitions */
void SetBusClock_24MHZ(void);
void PWMDisable(byte channel);
void PWMEnable(byte channel);
void PWMSinglePortSetting(byte channel ,byte period ,byte duty) ;
void PWMsinglePortInitial(byte channel, byte clkab,byte clock, byte polarity,byte align) ;
void Service_WD(void);
void PWMGeneralInitial(byte prclk,byte scla,byte sclb,byte ctl);
void PWMConcatenateSetting(byte channel,word period,word duty);
void main(void)
{
/* put your own code here */
//总线时钟频率设置:24M
SetBusClock_24MHZ();
//对预分频时钟,分频时钟A,分频时钟B和控制寄存器的配置
//0分频 01级联
PWMGeneralInitial(0,24,0,0x10);
//PWM端口寄存器的配置
// 1通道 SA时钟 起始高电平 左对齐
PWMsinglePortInitial(1,0,1,1,0);
//PWM级联输出配置
//50HZ 占空比12.5%
PWMConcatenateSetting(1,10000,250);
//EnableInterrupts;
for(;;) {
_FEED_COP(); /* feeds the dog */
} /* loop forever */
/* please make sure that you never leave main */
}
//*********************************************
//函数名:PWMEnable
//函数功能:PWM单个端口使能
//函数参数:一个 byte 类型channel 代表PWM通道号
// 返回值:无
//********************************************
void PWMEnable(byte channel)
{
if(channel》7) channel=7;
PWME|=(1《《channel); //选择使能位
}
//**********************************************
//函数名称:PWMDisable
//函数功能:PWM单个端口禁止
//函数参数:一个byte类型 channel 代表PWM通道号
//返回值:无
//***********************************************
void PWMDisable(byte channel)
{
if(channel》7) channel=7;
PWME&=~(1《《channel); //选择禁止位
}
//函数功能:启动看门狗
void Service_WD(void)
{
CPMUARMCOP=0x55;
CPMUARMCOP=0xAA;
}
//函数功能:总线时钟设置
void SetBusClock_24MHZ(void)
{
CPMUOSC_OSCE=1; //enable osc
/*
时钟倍频:24MHz BusClock
48MHz VCO
48MHz PLL
*/
CPMUSYNR=0x00|0x05; //VCOFRQ[1:0],SYNDIV[5:0]
CPMUREFDIV=0x20|0x03;//REFFRQ[1:0],REFDIV[3:0]
CPMUPOSTDIV=0x00; //POSTDIV=0;
while(!CPMUFLG_LOCK)//等待VCO稳定
Service_WD(); //看门狗
CPMUCLKS_PLLSEL=1;
}
//*********************************************
//函数名称: PWMSinglePortSetting
//函数功能:实现PWM周期寄存器和占空比寄存器通道的单独输出
//函数参数:3个 byte类型
//参数1: channel代表了当前配置的PWM通道
//参数2: period 周期配置参数
/*
Left aligned output (CAEx = 0) PWMx Period = Channel Clock Period * PWMPERx
Center Aligned Output (CAEx = 1) PWMx Period = Channel Clock Period * (2 * PWMPERx)
*/
//参数3: duty 占空比配置参数
/*
Polarity = 0 (PPOL x =0) Duty Cycle = [(PWMPERx-PWMDTYx)/PWMPERx] * 100%
Polarity = 1 (PPOLx = 1) Duty Cycle = [PWMDTYx / PWMPERx] * 100%
*/
//返回值:无
//**********************************************
void PWMSinglePortSetting(byte channel ,byte period ,byte duty)
{
if(channel》7) channel=7;
PWMDisable(channel); //禁止该通道
switch(channel)
{
case 0:
PWMPER0=period; //设置周期寄存器
PWMDTY0=duty; //设置占空比寄存器
break;
case 1:
PWMPER1=period; //设置周期寄存器
PWMDTY1=duty; //设置占空比寄存器
case 2:
PWMPER2=period; //设置周期寄存器
PWMDTY2=duty; //设置占空比寄存器
break;
case 3:
PWMPER3=period; //设置周期寄存器
PWMDTY3=duty; //设置占空比寄存器
break;
case 4:
PWMPER4=period; //设置周期寄存器
PWMDTY4=duty; //设置占空比寄存器
break;
case 5:
PWMPER5=period; //设置周期寄存器
PWMDTY5=duty; //设置占空比寄存器
break;
case 6:
PWMPER6=period; //设置周期寄存器
PWMDTY6=duty; //设置占空比寄存器
break;
case 7:
PWMPER7=period; //设置周期寄存器
PWMDTY7=duty; //设置占空比寄存器
break;
default:break;
}
PWMEnable(channel);
}
//*********************************************
//函数名:PWMSinglePortInitial
//函数功能:PWM端口寄存器的配置
//函数参数:5个byte类型
//参数1:channel 代表了当前配置的PWM通道
//参数2:clkab 参数2,3决定了时钟源的选择
//参数3: clock
/*
PWM Channel 0,1,4,5
PCLKAB[0,1,4,5] PCLK[0,1,4,5] Clock Source Selection
0 0 Clock A
0 1 Clock SA
1 0 Clock B
1 1 Clock SB
PWM Channel 2,3,6,7
PCLKAB[2,3,6,7] PCLK[2,3,6,7] Clock Source Selection
0 0 Clock B
0 1 Clock SB
1 0 Clock A
1 1 Clock SA
*/
//参数4:polarity PWM极性选择
// 0 开始为低电平,周期计数开始为高电平
// 1 开始为高电平,周期计数开始为低电平
//参数5:align PWM对齐方式选择
// 0 输出左对齐
// 1 输出中心对齐
//返回值:无
//**********************************************
void PWMsinglePortInitial(byte channel, byte clkab,byte clock, byte polarity,byte align)
{
if(channel》7) channel=7;
//禁止该通道
PWMDisable(channel);
// PWM 时钟A/B 选择
if(clkab==0) PWMCLKAB&=~(1《《channel);
else PWMCLKAB|=(1《《channel);
// PWM 时钟选择寄存器设置
if(clock==0) PWMCLK&=~(1《《channel);
else PWMCLK|=(1《《channel);
//PWM 极性选择设置
if(polarity==0) PWMPOL&=~(1《《channel) ;
else PWMPOL|=(1《《channel);
//PWM 对齐方式设置
if(align==0) PWMCAE&=~(1《《channel);
else PWMCAE|=(1《《channel);
}
//**********************************************************
//函数名:PWMGeneralInitial
//函数功能:对预分频时钟,分频时钟A,分频时钟B和控制寄存器的配置
//函数参数:4个byte类型
//参数1 prclk
/*
Clock A or Clock B Prescaler Selects
PCKA/B2 PCKA/B1 PCKA/B0 Value of Clock A/B
0 0 0 Bus clock
0 0 1 Bus clock / 2
0 1 0 Bus clock / 4
0 1 1 Bus clock / 8
1 0 0 Bus clock / 16
1 0 1 Bus clock / 32
1 1 0 Bus clock / 64
1 1 1 Bus clock / 128
*/
//参数2: scla
// Clock SA = Clock A / (2 * PWMSCLA)
//参数3: sclb
// Clock SB = Clock B / (2 * PWMSCLB)
//参数4: ctl
/*
control[CON67,CON45,CON23,CON01,PSWAI,PFRZ]
PWM级联控制寄存器 CON67,CON45,CON23,CON01
0 单独一个通道
1 两个通道级联
PSWAI 0 等待模式禁止时钟输入
1 等待模式允许时钟输入
PFRZ 0 冻结模式允许PWM时钟输入
1 冻结模式禁止PWM时钟输入
//返回值:无
*/
//**************************************************************
void PWMGeneralInitial(byte prclk,byte scla,byte sclb,byte ctl)
{
//禁止所有的PWM通道
PWME=0x00;
//设置预分频参数
PWMPRCLK=prclk;
//设置A分频参数
PWMSCLA=scla;
//设置B分频参数
PWMSCLB=sclb;
//级联配置
PWMCTL=ctl;
}
//***********************************************************
//函数名称:PWMConcatenateSetting
//函数功能:PWM级联输出配置
//函数参数:1个byte类型,2个word类型
//参数1: channel代表了当前配置的PWM通道
//参数2: period 周期配置参数
/*
Left aligned output (CAEx = 0) PWMx Period = Channel Clock Period * PWMPERx
Center Aligned Output (CAEx = 1) PWMx Period = Channel Clock Period * (2 * PWMPERx)
*/
//参数3: duty 占空比配置参数
/*
Polarity = 0 (PPOL x =0) Duty Cycle = [(PWMPERx-PWMDTYx)/PWMPERx] * 100%
Polarity = 1 (PPOLx = 1) Duty Cycle = [PWMDTYx / PWMPERx] * 100%
*/
//返回值:无
//**************************************************************
void PWMConcatenateSetting(byte channel,word period,word duty)
{
if(channel》7) channel=7;
switch(channel)
{
case 0:
case 1:PWMDisable(0); //禁止通道0
PWMDisable(1); //禁止通道1
PWMPER01=period; //设置周期寄存器
PWMDTY01=duty; //设置占空比寄存器
PWMEnable(0); //使能通道0;
PWMEnable(1); //使能通道1;
break;
case 2:
case 3:PWMDisable(2); //禁止通道2
PWMDisable(3); //禁止通道3
PWMPER23=period; //设置周期寄存器
PWMDTY23=duty; //设置占空比寄存器
PWMEnable(2); //使能通道2;
PWMEnable(3); //使能通道3;
break;
case 4:
case 5:PWMDisable(4); //禁止通道4
PWMDisable(5); //禁止通道5
PWMPER45=period; //设置周期寄存器
PWMDTY45=duty; //设置占空比寄存器
PWMEnable(4); //使能通道4;
PWMEnable(5); //使能通道5;
break;
case 6:
case 7:PWMDisable(6); //禁止通道6
PWMDisable(7); //禁止通道7
PWMPER67=period; //设置周期寄存器
PWMDTY67=duty; //设置占空比寄存器
PWMEnable(6); //使能通道6;
PWMEnable(7); //使能通道7;
break;
default:break;
}
}
评论
查看更多