PWM应用程序
/*
程序实现功能:PP1口输出PWM方波
程序说明:通过改变duty和period ,从而控制PWM周期和占空比 duty cycle=duty/period
PWM frequency=1M/(2*period)(Fbus=24M,scla=24) */
#include
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< //********************************************** //函数名称:PWMDisable //函数功能:PWM单个端口禁止 //函数参数:一个byte类型 channel 代表PWM通道号 //返回值:无 //*********************************************** void PWMDisable(byte channel) { if(channel>7) channel=7; PWME&=~(1< //函数功能:启动看门狗 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 [(PWMPERx-PWMDTYx)/PWMPERx] * 100% * 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; //设置占空比寄存器 (PPOL x =0) Duty Cycle = Polarity = 1 (PPOLx = 1) Duty Cycle = [PWMDTYx / PWMPERx] 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< if(clock==0) PWMCLK&=~(1< if(polarity==0) PWMPOL&=~(1< if(align==0) PWMCAE&=~(1< //********************************************************** //函数名: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) 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库freescale 单片机MC9S12G128应用程序(PWM,Timer,ADC……)在线全文阅读。
相关推荐: