-
PWM
应用程序
/*
程序实现功能:
PP1
口输出
PWM
方波
程序说明:通过改变
duty
和
period
,从而控制
PWM
周期和占空比
duty
cycle=duty/period
PWM
frequency=1M/(2*period)(Fbus=24M,scla=24)
*/
#include
/* common defines and
macros */
#include
/* 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();
//<
/p>
对预分频时钟,分频时钟
A
,分频时钟<
/p>
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 <
/p>
//
函数功能:
PWM
< br>单个端口使能
//
函数参数:一个
byte
类型
channel
p>
代表
PWM
通道号
//
返回值:无
< br>//********************************************
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;//REFF
RQ[1:0],REFDIV[3:0]
CPMUPOSTDIV=0x00;
//POSTDIV=0;
while(!CPMUFLG_LOCK)//
等待
VCO
稳定
Service_WD();
//
看门狗
CPMUCLKS_PLLSEL=1;
}
//********************************************
*
//
函数名称:
PWMSinglePortSetting
//
函数功能:实现
PWM
周期寄存器和占空比寄存器
通道的单独输出
//
函数参数:
p>
3
个
byte
类型
p>
//
参数
1
:
p>
chann
el
代表了当前配置的
PWM
通道
p>
//
参数
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)
*/
p>
//
参数
3
:
p>
duty
占空比配置参数
/*
Polarity
=
0
[(PWMPERx-
PWMDTYx)/PWMPERx] * 100%
* 100%
*/
//
返回值:无
p>
//***************************************
*******
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);
}
//*************************
********************
//
函数名:<
/p>
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
*/
//<
/p>
参数
4
:
pol
arity 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)
<
br>// <
br>
PWM 级联输出配置 类型 //**********************************************
****************
PWMCLKAB&=~(1<
else
PWMCLKAB|=(1<
// PWM
时钟选择寄存器设置
if(clock==0)
PWMCLK&=~(1<
else
PWMCLK|=(1<
//PWM
极性选择设置
if(polarity==0)
PWMPOL&=~(1<
else
PWMPOL|=(1<
//PWM
对齐方式设置
if(align==0)
PWMCAE&=~(1<
else
PWMCAE|=(1<
}
//************************
**********************************
//
p>
函数名
:PWMGeneralInitial
函数功能:对预分频时钟,分频时钟
A
,分频时钟
B
和控制寄存器的配置
//
函数参数:
4
个
byte
类型
p>
//
参数
1
?
p>
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)
p>
//
参数
3
:
p>
sclb
//
Clock SB =
Clock B / (2 * PWMSCLB)
//
参数
4
:
ctl
/*
control[CON67,CON45,CON23,C
ON01,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)
{
//
禁止所有的
通道
PWME=0x00;
//
设置预分频参数
PWMPRCLK=prclk;
//
设置
A
分频参数
PWMSCLA=scla;
//
设置
B
分频参数
PWMSCLB=sclb;
//
级联配置
PWMCTL=ctl;
}
//************************
***********************************
//<
/p>
函数名称
:PWMConcatenateSetting
p>
//
函数功能
:PWM
//
函数参数
p>
:1
个
byte
类
型,
2
个
word
p>
//
参数
1
:
p>
chann
el
代表了当前配置的
PWM
通道
p>
//<
/p>
参数
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)
*/
p>
//
参数
3
:
p>
duty
占空比配置参数
/*
Polarity
=
0
[(PWMPERx-
PWMDTYx)/PWMPERx] * 100%
(PPOL
x
=0)
Duty
Cycle
=
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
-
-
-
-
-
-
-
-
-
上一篇:EFM32 Cortex参考手册
下一篇:STM32-USART1学习笔记