📄 pwm.c
字号:
#include <LPC214X.H> /* LPC214x definitions */
//-------- <<< Use Configuration Wizard in Context Menu >>> -----------------
//
//
/*
// <e> 使用PWM
// <h> PWM通道
// <o1.1> PWM 1 通道
// <o1.2> PWM 2 通道
// <o1.3> PWM 3 通道
// <o1.4> PWM 4 通道
// <o1.5> PWM 5 通道
// <o1.6> PWM 6 通道
// </h>
// <h> 测试PWM
// <o2.0> 测试PWM
// </h>
// </e>
*/
#define PWM_SWITCH 1
#define PWM_CHANNELS 0x007E
#define PWM_TEST 0
#define uint8 unsigned char
#define uint32 unsigned int
#if PWM_SWITCH
#define PWM_MINI_PLUS 120
int iaPWMCode[7] = {PWM_MINI_PLUS*10,PWM_MINI_PLUS*5,PWM_MINI_PLUS*2,PWM_MINI_PLUS*3,PWM_MINI_PLUS*4,PWM_MINI_PLUS*5,PWM_MINI_PLUS*6};
/*
********************************************************************************************************
** 函数名称: Delay
** 功能描述: 软件延时函数
*******************************************************************************************************
*/
#if PWM_TEST
void Delay(uint8 dly)
{
uint32 i;
for(; dly != 0; dly--)
for(i = 0; i < 0xFFF; i++);
}
#endif
/*
*******************************************************************************************************
** 函数名: UpDataPWM
** 功能描述: 更新PWM匹配值,脉宽.
*******************************************************************************************************
*/
void UpDataPWM(void){
PWMMR1 = iaPWMCode[1]; // 设置PWM1输出1/2占空比
PWMMR2 = iaPWMCode[2]; // 设置PWM2输出1/3占空比
PWMMR3 = iaPWMCode[3]; // 设置PWM3输出1/4占空比
PWMMR4 = iaPWMCode[4]; // 设置PWM4输出1/5占空比
PWMMR5 = iaPWMCode[5]; // 设置PWM5输出1/6占空比
PWMMR6 = iaPWMCode[6]; // 设置PWM6输出1/7空比
PWMLER = 0x7F; // 更新匹配值后,必须锁存
}
/*
*******************************************************************************************************
** 函数名: SetPWMTC
** 功能描述: 设置PWM周期.
*******************************************************************************************************
*/
void SetPWMTCPWM(void){
PWMMR0 = iaPWMCode[0]; // 设置PWM输出周期
PWMLER = 0x7F; // 更新匹配值后,必须锁存
}
/*
*********************************************************************************************************
** 函数名称 :InitPWM
** 函数功能 :初始化PWM
*********************************************************************************************************
*/
void InitPWM (void){
// 在这里选择PWM通道的输出
#if (PWM_CHANNELS & (1 << 1))
PINSEL0 &= ~(0x03 << 0); // P0.0选择PWM1功能,功能选择码:10,功能选择位:BIT1:0,所在功能选择寄存器PINSEL0
PINSEL0 |= 0x02 << 0; // P0.0选择PWM1功能,功能选择码:10
#endif
#if (PWM_CHANNELS & (1 << 2))
PINSEL0 &= ~(0x03 << 14); // P0.7选择PWM2功能,功能选择码:10,功能选择位:BIT15:14,所在功能选择寄存器PINSEL0
PINSEL0 |= 0x02 << 14; // P0.7选择PWM2功能,功能选择码:10
#endif
#if (PWM_CHANNELS & (1 << 3))
PINSEL0 &= ~(0x03 << 2); // P0.1选择PWM3功能,功能选择码:10,功能选择位:BIT3:2,所在功能选择寄存器PINSEL0
PINSEL0 |= 0x02 << 2; // P0.1选择PWM3功能,功能选择码:10
#endif
#if (PWM_CHANNELS & (1 << 4))
PINSEL0 &= ~(0x03 << 16); // P0.8选择PWM4功能,功能选择码:10,功能选择位:BIT17:16,所在功能选择寄存器PINSEL0
PINSEL0 |= 0x02 << 16; // P0.8选择PWM4功能,功能选择码:10
#endif
#if (PWM_CHANNELS & (1 << 5))
PINSEL1 &= ~(0x03 << 10); // P0.21选择PWM5功能,功能选择码:01,功能选择位:BIT11:10,所在功能选择寄存器PINSEL1
PINSEL1 |= 0x01 << 10; // P0.21选择PWM5功能,功能选择码:01
#endif
#if (PWM_CHANNELS & (1 << 6))
PINSEL0 &= ~(0x03 << 18); // P0.9选择PWM6功能,功能选择码:10,功能选择位:BIT19:18,所在功能选择寄存器PINSEL0
PINSEL0 |= 0x02 << 18; // P0.9选择PWM6功能,功能选择码:10
#endif
/* PWM初始化 */
PWMPR = 0x00; // 分频器寄存器. 不分频,计数频率为Fpclk.
PWMMCR = 0x02;; // PWM匹配寄存器. 设置PWMMR匹配时复位PWMTC.3n+0数位设置中断,3n+1数位设置复位,3n+2数位停止.
PWMPCR = 0x7E00; // PWM控制寄存器. 允许PWM输出,单边PWM. BIT9~BIT14使能PWM输出.BIT2~6设置PWM工作模式.
SetPWMTCPWM();
UpDataPWM();
PWMLER = 0x7E; // PWM锁存使能寄存器. PWM0和PWM2匹配锁存 (BIT0~BIT6:使能PWM匹配0锁存器~使能PWM匹配6锁存器)
PWMTCR = 0x02; // PWM定时器控制寄存器. 复位PWMTC ( BIT0: 计数器使能 BIT1:计数器复位 BIT3:PWM使能 )
PWMTCR = 0x09; // PWM定时器控制寄存器. 启动PWM输出
}
#if PWM_TEST
int main(void){
int i;
InitPWM();
while(1){
for(i = 0; i<iaPWMCode[0]; i++){
iaPWMCode[1] = i;
iaPWMCode[2] = i;
iaPWMCode[3] = i;
iaPWMCode[4] = i;
iaPWMCode[5] = i;
iaPWMCode[6] = i;
UpDataPWM();
Delay(1);
}
}
return 0;
}
#endif
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -