这些是我自己常用的代码,比官方的要简洁些,主要是自用,还有相关模块,使用代码。
具体文件可以去我github上下载。
pwm简介
脉冲宽度调制是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
脉冲宽度调制是一种模拟控制方式,其根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。
PWM控制技术以其控制简单,灵活和动态响应好的优点而成为电力电子技术最广泛应用的控制方式,也是人们研究的热点。由于当今科学技术的发展已经没有了学科之间的界限,结合现代控制理论思想或实现无谐振波开关技术将会成为PWM控制技术发展的主要方向之一。其根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。
源码main函数
#include "systemInit.h"
#include <ctype.h>
#include <timer.h>
#define PART_LM3S1138
#include <pin_map.h>
#include <math.h>
int T1A , T1B , T2A , T2B ;
void Moto_Init(void){ //³õʼ»¯µç»ú
SysCtlPeriEnable(SYSCTL_PERIPH_TIMER1); // ʹÄÜTIMER1Ä£¿é
SysCtlPeriEnable(SYSCTL_PERIPH_TIMER2); // ʹÄÜTIMER2Ä£¿é
SysCtlPeriEnable(CCP2_PERIPH); // ʹÄÜCCP2ËùÔÚµÄGPIO¶Ë¿Ú
SysCtlPeriEnable(CCP3_PERIPH); // ʹÄÜCCP3ËùÔÚµÄGPIO¶Ë¿Ú
SysCtlPeriEnable(CCP4_PERIPH); // ʹÄÜCCP4ËùÔÚµÄGPIO¶Ë¿Ú
SysCtlPeriEnable(CCP5_PERIPH); // ʹÄÜCCP5ËùÔÚµÄGPIO¶Ë¿Ú
GPIOPinTypeTimer(CCP2_PORT, CCP2_PIN); // ÉèÖÃÏà¹Ø¹Ü½ÅΪTimer¹¦ÄÜ
GPIOPinTypeTimer(CCP3_PORT, CCP3_PIN); // ÉèÖÃÏà¹Ø¹Ü½ÅΪTimer¹¦ÄÜ
GPIOPinTypeTimer(CCP4_PORT, CCP4_PIN); // ÉèÖÃÏà¹Ø¹Ü½ÅΪTimer¹¦ÄÜ
GPIOPinTypeTimer(CCP5_PORT, CCP5_PIN); // ÉèÖÃÏà¹Ø¹Ü½ÅΪTimer¹¦ÄÜ
TimerConfigure(TIMER1_BASE, TIMER_CFG_16_BIT_PAIR | // ÅäÖÃTimerΪ˫16λPWM
TIMER_CFG_A_PWM |
TIMER_CFG_B_PWM);
TimerConfigure(TIMER2_BASE, TIMER_CFG_16_BIT_PAIR | // ÅäÖÃTimerΪ˫16λPWM
TIMER_CFG_A_PWM |
TIMER_CFG_B_PWM);
TimerControlLevel(TIMER1_BASE, TIMER_BOTH, true); // ¿ØÖÆPWMÊä³ö·´Ïà
TimerControlLevel(TIMER2_BASE, TIMER_BOTH, true);
TimerLoadSet(TIMER1_BASE, TIMER_BOTH, 1000); // ÉèÖÃTimerBoth³õÖµ
TimerLoadSet(TIMER2_BASE, TIMER_BOTH, 1000);
TimerMatchSet(TIMER1_BASE, TIMER_A, 0); // ÉèÖÃTimerBÆ¥ÅäÖµ
TimerMatchSet(TIMER1_BASE, TIMER_B, 0); // ÉèÖÃTimerBÆ¥ÅäÖµ
TimerMatchSet(TIMER2_BASE, TIMER_A, 0); // ÉèÖÃTimerBÆ¥ÅäÖµ
TimerMatchSet(TIMER2_BASE, TIMER_B, 0); // ÉèÖÃTimerBÆ¥ÅäÖµ
TimerEnable(TIMER1_BASE, TIMER_BOTH); // ʹÄÜTimer¼ÆÊý£¬PWM¿ªÊ¼Êä³ö
TimerEnable(TIMER2_BASE, TIMER_BOTH);
}
// Ö÷º¯Êý£¨³ÌÐòÈë¿Ú£©
int main(void)
{
jtagWait(); // ·ÀÖ¹JTAGʧЧ£¬ÖØÒª£¡
clockInit(); // ʱÖÓ³õʼ»¯£º¾§Õñ£¬6MHz
Moto_Init();
while(1)
{
TimerMatchSet(TIMER1_BASE, TIMER_A, T1A); // ÉèÖÃTimerBÆ¥ÅäÖµ
TimerMatchSet(TIMER1_BASE, TIMER_B, T1B); // ÉèÖÃTimerBÆ¥ÅäÖµ
TimerMatchSet(TIMER2_BASE, TIMER_A, T2A); // ÉèÖÃTimerBÆ¥ÅäÖµ
TimerMatchSet(TIMER2_BASE, TIMER_B, T2B); // ÉèÖÃTimerBÆ¥ÅäÖµ
}
}