每个Stellaris PWM模块提供3个PWM发生器模块和1个输出控制模块。每个发生器模块有2个PWM输出信号,它们可以单独操作,或者作为带有插入死区延时的一对信号来使用。每个发生器模块还有一个中断输出和一个触发输出。控制模块决定了PWM信号的极性以及哪些信号经过模块到达管脚。
Stellaris PWM模块具有的特性有:
3个发生器模块,每个包含:
♦ 1个16位的递减或递增/递减计数器;
♦ 2个比较器;
♦ PWM发生器;
♦ 死区发生器。
控制模块
♦ PWM输出使能;
♦ 输出极性控制;
♦ 同步;
♦ 故障处理;
♦ 中断状态。
这个驱动程序包含在src/pwm.c中,src/pwm.h包含应用使用的API定义。
想让PWM驱动LED闪就是不断改变电压,也就是改变占空比
以下程序控制着LM3S811板子的L5,L6分别是PB0,PB1上的PWM2,PWM3
需要强调的是那个中断必须加到S文件中,
EXTERN PWM_Generator_1_ISR 加到.S文件上边部分
LIB文件夹里装有用到的库文件,如图所示
程序如下:
#include <LM3Sxxx.H>
#define PB0_PWM2 GPIO_PIN_0
#define PB1_PWM3 GPIO_PIN_1
// 防止JTAG失效
void jtagWait(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); // 使能KEY所在的GPIO端口
GPIOPinTypeGPIOInput(GPIO_PORTC_BASE,GPIO_PIN_4); // 设置KEY所在管脚为输入
if (GPIOPinRead(GPIO_PORTC_BASE,GPIO_PIN_4) == 0x00) // 若复位时按下KEY,则进入
{
while(1); // 死循环,以等待JTAG连接
}
SysCtlPeripheralDisable(SYSCTL_PERIPH_GPIOC); // 禁止KEY所在的GPIO端口
}
/*********************************************************************************************************
** Function name: main()
** Descriptions: 主函数
** input parameters: NONE
** output parameters: NONE
** Returned value: NONE
*********************************************************************************************************/
int main (void)
{
jtagWait();
SysCtlClockSet(SYSCTL_SYSDIV_1 | /* 配置6MHz外部晶振作为主时钟 */
SYSCTL_USE_OSC |
SYSCTL_OSC_MAIN |
SYSCTL_XTAL_6MHZ);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); /* 使能PWM2和PWM3输出所在GPIO */
SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM); /* 使能PWM模块 */
SysCtlPWMClockSet(SYSCTL_PWMDIV_1); /* PWM时钟配置:不分频 */
GPIOPinTypePWM(GPIO_PORTB_BASE, /* PB0和PB1配置为PWM功能 */
GPIO_PIN_0 | GPIO_PIN_1);
PWMGenConfigure(PWM_BASE, PWM_GEN_1, /* 配置PWM发生器1:加减计数 */
PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC);
PWMGenPeriodSet(PWM_BASE, PWM_GEN_1, 60000); /* 设置PWM发生器1的周期 */
PWMPulseWidthSet(PWM_BASE, PWM_OUT_2, 3000); /* 设置PWM2输出的脉冲宽度 */
PWMPulseWidthSet(PWM_BASE, PWM_OUT_3, 3000); /* 设置PWM3输出的脉冲宽度 */
PWMOutputState(PWM_BASE, /* 使能PWM2和PWM3的输出 */
PWM_OUT_2_BIT | PWM_OUT_3_BIT,
true);
PWMGenEnable(PWM_BASE, PWM_GEN_1); /* 使能PWM发生器1,开始产生 */
/* PWM方波 */
PWMGenIntTrigEnable(PWM_BASE, /* 使能PWM发生器1归零触发中断 */
PWM_GEN_1,
PWM_INT_CNT_ZERO);
PWMIntEnable(PWM_BASE, PWM_GEN_1); /* 使能PWM发生器1中断 */
IntEnable(INT_PWM1); /* 使能PWM1中断 */
IntMasterEnable(); /* 使能总中断 */
for (;;) {
}
}
/*********************************************************************************************************
** Function name: PWM_Generator_1_ISR()
** Descriptions: PWM发生器1中断服务函数
** input parameters: NONE
** output parameters: NONE
** Returned value: NONE
*********************************************************************************************************/
void PWM_Generator_1_ISR (void)
{
const unsigned long ulTab[10] =
{
3000, 9000, 15000, 21000, 27000,
33000, 39000, 45000, 51000, 57000
};
static unsigned long n = 0;
PWMGenIntClear(PWM_BASE,
PWM_GEN_1,
PWM_INT_CNT_ZERO);
PWMPulseWidthSet(PWM_BASE, PWM_OUT_2, ulTab[n]); /* 设置PWM2输出的周期 */
PWMPulseWidthSet(PWM_BASE, PWM_OUT_3, ulTab[9-n]); /* 设置PWM3输出的周期 */
n++;
if ( n >= 10 ) {
n = 0;
}
}
程序打包:
myPWMLED.zip
(1.32 KB, 下载次数: 115)