MSP430F5529 DriverLib 库函数学习笔记(六)定时器A产生PWM波
目录
- 1.通过Timer_A_outputPWM配置产生PWM波
- 初始化函数
- 计算
- 修改占空比的函数
- 整体程序
- 效果
- 2.单定时器产生多路PWM信号
- 初始化函数
- 实验结果
- 3.对称PWM信号的产生
- 初始化程序
- 实验结果
平台:Code Composer Studio 10.3.1
MSP430F5529 LaunchPad™ Development Kit
(MSP‑EXP430F5529LP)
1.通过Timer_A_outputPWM配置产生PWM波
所选输出引脚为P1.2
初始化函数
#define TIMER_PERIOD 12500
void Timer_A_PWM_Init(void)
{Timer_A_outputPWMParam htim = {0};//P1.2复用输出GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P1, GPIO_PIN2); //时钟源选为SMCLK = 25MHzhtim.clockSource = TIMER_A_CLOCKSOURCE_SMCLK; //分频系数设为40htim.clockSourceDivider = TIMER_A_CLOCKSOURCE_DIVIDER_40;//装载值设为12500 - 1htim.timerPeriod = TIMER_PERIOD - 1;//P1.2 对应 TA0.1 故设为TIMER_A_CAPTURECOMPARE_REGISTER_1htim.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_1;htim.compareOutputMode = TIMER_A_OUTPUTMODE_RESET_SET;//初始比较值为装载值的一半 即初始占空比为50%htim.dutyCycle = TIMER_PERIOD / 2;//P1.2 对应 TA0.1 为TIMER_A0_BASETimer_A_outputPWM(TIMER_A0_BASE, &htim);
}
计算
时钟源为SMCLK = 25MHz
分频系数为40
装载值为12500 - 1
故所得PWM频率为25MHz/40/12500=50Hz
修改占空比的函数
修改占空比即修改比较值,故使用Timer_A_setCompareValue函数
我选择在外部中断服务函数内进行修改,按下一次按钮分别为占空比减少10%和增加10%
//******************************************************************************
//
//This is the PORT2_VECTOR interrupt vector service routine
//
//******************************************************************************
#pragma vector=PORT2_VECTOR // P2口中断源
__interrupt
void Port_2 (void) // 声明一个中断服务程序,名为Port_2()
{if(GPIO_getInterruptStatus(GPIO_PORT_P2, GPIO_PIN1)){delay_ms(20);if(!GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN1)){//P1.0 = toggleTimer_A_setCompareValue(TIMER_A0_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_1,Timer_A_getCaptureCompareCount(TIMER_A0_BASE, TIMER_A_CAPTURECOMPARE_REGISTER_1) - TIMER_PERIOD / 10);while(!GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN1));}//P2.1 IFG clearedGPIO_clearInterrupt(GPIO_PORT_P2, GPIO_PIN1);}
}//******************************************************************************
//
//This is the PORT1_VECTOR interrupt vector service routine
//
//******************************************************************************
#pragma vector=PORT1_VECTOR // P2口中断源
__interrupt
void Port_1 (void) // 声明一个中断服务程序,名为Port_1()
{if(GPIO_getInterruptStatus(GPIO_PORT_P1, GPIO_PIN1)){delay_ms(20);if(!GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN1)){//P1.0 = toggleTimer_A_setCompareValue(TIMER_A0_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_1,Timer_A_getCaptureCompareCount(TIMER_A0_BASE, TIMER_A_CAPTURECOMPARE_REGISTER_1) + TIMER_PERIOD / 10);while(!GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN1));}//P2.1 IFG clearedGPIO_clearInterrupt(GPIO_PORT_P1, GPIO_PIN1);}
}
整体程序
#include "driverlib.h"#define MCLK_IN_HZ 25000000#define delay_us(x) __delay_cycles((MCLK_IN_HZ/1000000*(x)))
#define delay_ms(x) __delay_cycles((MCLK_IN_HZ/1000*(x)))void SystemClock_Init(void)
{PMM_setVCore(PMM_CORE_LEVEL_3); //高主频工作需要较高的核心电压//XT1引脚复用GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5, GPIO_PIN4);GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P5, GPIO_PIN5);//起振XT1UCS_turnOnLFXT1(UCS_XT1_DRIVE_3,UCS_XCAP_3);//XT2引脚复用GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5, GPIO_PIN2);GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P5, GPIO_PIN3);//起振XT2UCS_turnOnXT2(UCS_XT2_DRIVE_4MHZ_8MHZ);//XT2作为FLL参考时钟,先8分频,再50倍频 4MHz / 8 * 50 = 25MHzUCS_initClockSignal(UCS_FLLREF, UCS_XT2CLK_SELECT, UCS_CLOCK_DIVIDER_8);UCS_initFLLSettle(25000, 50);//XT1作为ACLK时钟源 = 32768HzUCS_initClockSignal(UCS_ACLK, UCS_XT1CLK_SELECT, UCS_CLOCK_DIVIDER_1);//DCOCLK作为MCLK时钟源 = 25MHzUCS_initClockSignal(UCS_MCLK, UCS_DCOCLK_SELECT, UCS_CLOCK_DIVIDER_1);//DCOCLK作为SMCLK时钟源 = 25MHzUCS_initClockSignal(UCS_SMCLK, UCS_DCOCLK_SELECT, UCS_CLOCK_DIVIDER_1);//设置外部时钟源的频率,使得在调用UCS_getMCLK, UCS_getSMCLK 或 UCS_getACLK时可得到正确值UCS_setExternalClockSource(32768, 4000000);
}#define TIMER_PERIOD 12500
void Timer_A_PWM_Init(void)
{Timer_A_outputPWMParam htim = {0};GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P1, GPIO_PIN2);htim.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;htim.clockSourceDivider = TIMER_A_CLOCKSOURCE_DIVIDER_40;htim.timerPeriod = TIMER_PERIOD - 1;htim.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_1;htim.compareOutputMode = TIMER_A_OUTPUTMODE_RESET_SET;htim.dutyCycle = TIMER_PERIOD / 2;Timer_A_outputPWM(TIMER_A0_BASE, &htim);
}void KEY_S1_Init(void)
{GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P2, GPIO_PIN1);//P2.1 interrupt enabledGPIO_enableInterrupt(GPIO_PORT_P2, GPIO_PIN1); //使能中断//P2.1 Hi/Lo edgeGPIO_selectInterruptEdge(GPIO_PORT_P2, GPIO_PIN1, GPIO_HIGH_TO_LOW_TRANSITION); //设置中断类型//P2.1 IFG clearedGPIO_clearInterrupt(GPIO_PORT_P2, GPIO_PIN1); //清除中断标志位
}void KEY_S2_Init(void)
{GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN1);//P2.1 interrupt enabledGPIO_enableInterrupt(GPIO_PORT_P1, GPIO_PIN1); //使能中断//P2.1 Hi/Lo edgeGPIO_selectInterruptEdge(GPIO_PORT_P1, GPIO_PIN1, GPIO_HIGH_TO_LOW_TRANSITION); //设置中断类型//P2.1 IFG clearedGPIO_clearInterrupt(GPIO_PORT_P1, GPIO_PIN1); //清除中断标志位
}int main(void)
{WDT_A_hold(WDT_A_BASE);SystemClock_Init();Timer_A_PWM_Init();KEY_S1_Init();KEY_S2_Init();//interrupts enabled__bis_SR_register(GIE);while(1){}
}//******************************************************************************
//
//This is the PORT2_VECTOR interrupt vector service routine
//
//******************************************************************************
#pragma vector=PORT2_VECTOR // P2口中断源
__interrupt
void Port_2 (void) // 声明一个中断服务程序,名为Port_2()
{if(GPIO_getInterruptStatus(GPIO_PORT_P2, GPIO_PIN1)){delay_ms(20);if(!GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN1)){//P1.0 = toggleTimer_A_setCompareValue(TIMER_A0_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_1,Timer_A_getCaptureCompareCount(TIMER_A0_BASE, TIMER_A_CAPTURECOMPARE_REGISTER_1) - TIMER_PERIOD / 10);while(!GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN1));}//P2.1 IFG clearedGPIO_clearInterrupt(GPIO_PORT_P2, GPIO_PIN1);}
}//******************************************************************************
//
//This is the PORT1_VECTOR interrupt vector service routine
//
//******************************************************************************
#pragma vector=PORT1_VECTOR // P2口中断源
__interrupt
void Port_1 (void) // 声明一个中断服务程序,名为Port_1()
{if(GPIO_getInterruptStatus(GPIO_PORT_P1, GPIO_PIN1)){delay_ms(20);if(!GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN1)){//P1.0 = toggleTimer_A_setCompareValue(TIMER_A0_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_1,Timer_A_getCaptureCompareCount(TIMER_A0_BASE, TIMER_A_CAPTURECOMPARE_REGISTER_1) + TIMER_PERIOD / 10);while(!GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN1));}//P2.1 IFG clearedGPIO_clearInterrupt(GPIO_PORT_P1, GPIO_PIN1);}
}
效果
2.单定时器产生多路PWM信号
初始化函数
#define TIMER_PERIOD 12500
void Timer_A_PWM_Init(void)
{//复用P1.2、P1.3、P1.4、P1.5输出GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P1, GPIO_PIN2|GPIO_PIN3|GPIO_PIN4|GPIO_PIN5);Timer_A_initUpModeParam htim = {0};htim.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;htim.clockSourceDivider = TIMER_A_CLOCKSOURCE_DIVIDER_40;htim.timerPeriod = TIMER_PERIOD - 1;htim.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE;htim.captureCompareInterruptEnable_CCR0_CCIE = TIMER_A_CCIE_CCR0_INTERRUPT_DISABLE;htim.timerClear = TIMER_A_DO_CLEAR;htim.startTimer = true;Timer_A_initUpMode(TIMER_A0_BASE, &htim);Timer_A_initCompareModeParam htim_PWM = {0};htim_PWM.compareInterruptEnable = TIMER_A_CAPTURECOMPARE_INTERRUPT_DISABLE;htim_PWM.compareOutputMode = TIMER_A_OUTPUTMODE_RESET_SET;htim_PWM.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_1;htim_PWM.compareValue = (int)(TIMER_PERIOD * 0.2);//Initialize compare mode to generate PWM1Timer_A_initCompareMode(TIMER_A0_BASE, &htim_PWM);htim_PWM.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_2;htim_PWM.compareValue = (int)(TIMER_PERIOD * 0.4);//Initialize compare mode to generate PWM2Timer_A_initCompareMode(TIMER_A0_BASE, &htim_PWM);htim_PWM.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_3;htim_PWM.compareValue = (int)(TIMER_PERIOD * 0.6);//Initialize compare mode to generate PWM3Timer_A_initCompareMode(TIMER_A0_BASE, &htim_PWM);htim_PWM.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_4;htim_PWM.compareValue = (int)(TIMER_PERIOD * 0.8);//Initialize compare mode to generate PWM4Timer_A_initCompareMode(TIMER_A0_BASE, &htim_PWM);}
依次将TA0.1、TA0.2、TA0.3、TA0.4初始化为占空比20%、40%、60%、80%,
时钟源为SMCLK = 25MHz
分频系数为40
装载值为12500 - 1
故所得PWM频率为25MHz/40/12500=50Hz
实验结果
3.对称PWM信号的产生
初始化程序
将上一个程稍作修改,即可产生对称PWM信号
其中compareOutputMode值的效果参考下图
时钟源为SMCLK = 25MHz
分频系数为40
装载值为12500 - 1
因采用增\减计数模式
故所得PWM频率为25MHz/40/12500/2=25Hz
#define TIMER_PERIOD 12500
void Timer_A_PWM_Init(void)
{GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P1, GPIO_PIN2|GPIO_PIN3|GPIO_PIN4|GPIO_PIN5);Timer_A_initUpDownModeParam htim = {0};htim.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;htim.clockSourceDivider = TIMER_A_CLOCKSOURCE_DIVIDER_40;htim.timerPeriod = TIMER_PERIOD - 1;htim.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE;htim.captureCompareInterruptEnable_CCR0_CCIE = TIMER_A_CCIE_CCR0_INTERRUPT_DISABLE;htim.timerClear = TIMER_A_DO_CLEAR;htim.startTimer = true;Timer_A_initUpDownMode(TIMER_A0_BASE, &htim);Timer_A_initCompareModeParam htim_PWM = {0};htim_PWM.compareInterruptEnable = TIMER_A_CAPTURECOMPARE_INTERRUPT_DISABLE;htim_PWM.compareOutputMode = TIMER_A_OUTPUTMODE_TOGGLE_RESET;htim_PWM.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_1;htim_PWM.compareValue = (int)(TIMER_PERIOD * 0.2);//Initialize compare mode to generate PWM1Timer_A_initCompareMode(TIMER_A0_BASE, &htim_PWM);htim_PWM.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_2;htim_PWM.compareValue = (int)(TIMER_PERIOD * 0.4);//Initialize compare mode to generate PWM2Timer_A_initCompareMode(TIMER_A0_BASE, &htim_PWM);htim_PWM.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_3;htim_PWM.compareValue = (int)(TIMER_PERIOD * 0.6);//Initialize compare mode to generate PWM3Timer_A_initCompareMode(TIMER_A0_BASE, &htim_PWM);htim_PWM.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_4;htim_PWM.compareValue = (int)(TIMER_PERIOD * 0.8);//Initialize compare mode to generate PWM4Timer_A_initCompareMode(TIMER_A0_BASE, &htim_PWM);
}
实验结果
MSP430F5529 DriverLib 库函数学习笔记(六)定时器A产生PWM波相关推荐
- MSP430F5529 DriverLib 库函数学习笔记(十六)比较器B Comp_B
目录 硬知识 比较器B介绍 比较器 B 的特点 比较器 B 的结构 模拟输入部分 比较部分 基准电压部分 低通滤波部分 比较器和普通运放的区别 比较器B测量电阻原理 利用比较器B实现电容触摸按键原理 ...
- MSP430F5529 DriverLib 库函数学习笔记(十四)看门狗定时器 (WDT)
目录 硬知识 看门狗定时计数器 (WDTCNT) 看门狗模式 定时计数模式 看门狗定时器中断 时钟故障保护功能 低功耗模式下的看门狗操作 看门狗定时器控制寄存器 WDT_A API (机翻) 参数 上 ...
- MSP430F5529 DriverLib 库函数学习笔记(五)定时器A
目录 硬知识 定时器A 16位定时器原理 (1)时钟源选择和分频器 (2)Timer_A工作模式 (3)捕获/比较模块 (4)Timer_A中断(重要) 定时器A API (机翻) 定时器A配置和控制 ...
- MSP430F5529 DriverLib 库函数学习笔记(七)定时器B
目录 硬知识 Timer_B特点及结构 Timer_B寄存器 定时器B API 处理计时器配置和控制的函数 参数 处理计时器输出的函数 参数 管理定时器B中断的函数 参数 平台:Code Compos ...
- MSP430F5529 DriverLib 库函数学习笔记(八)模数转换模块(ADC12)
目录 硬知识 模数转换概述 MSP430单片机ADC12模块介绍 MSP430单片机ADC12模块操作 ADC12的转换模式 采样和转换 转换存储器 使用片内集成温度传感器 ADC12模块寄存器 AD ...
- MSP430F5529 DriverLib 库函数学习笔记(十二)I2C实战
目录 上机实战 I2C给 DAC 芯片 DAC7571 写入数字量 DAC7571 介绍 程序分析 引脚复用 I2C 初始化 发送一个字节 发送一个字 读取一个字节 读取多个字节 中断服务函数 整体代 ...
- MSP430F5529 DriverLib 库函数学习笔记(十)SPI驱动墨水屏
目录 上机实战 SPI 驱动 墨水屏 墨水屏介绍 电子纸的分类 电泳型电子纸技术详解 原理 结构 优势与不足 实验电路介绍 程序分析 引脚初始化 SPI模块初始化 发送和接收 全部源代码 main.c ...
- MSP430F5529 DriverLib 库函数学习笔记(四点五)printf打印输出
目录 代码实现 使相应工程支持打印浮点数 实验结果 平台:Code Composer Studio 10.3.1 MSP430F5529 LaunchPad™ Development Kit (MSP ...
- MSP430F5529 DriverLib 库函数学习笔记(四)UART通信
目录 硬知识 USCI通信模块 USCI的UART模式 1. USCI初始化和复位 2. 异步通信字符格式 3. 异步多机通信模式 4. 自动波特率检测 5. IrDA编码和解码 6. 自动错误检测 ...
最新文章
- 二级级联菜单---纯js实现
- [云炬创业学笔记]第二章决定成为创业者测试4
- Silverlight的报表查看器
- 【Pytorch神经网络实战案例】03 CIFAR-10数据集:Pytorch使用GPU训练CNN模版-测试方法
- 将你一张表的值覆盖_精准度可达亚米级,山东“北斗一张网”向社会免费开放...
- ApacheCN/iBooker 未来计划 2019.11
- 科比职业生涯数据分析
- 英国正在大举进军AI,看懂其三大投资走向
- 十大管理之项目干系人管理知识点
- 宝塔linux怎么安装asp网站,宝塔面板创建网站:宝塔linux面板添加网站详细教程...
- Windows搭建web站点:免费内网穿透发布至公网 1-2
- AP计算机科学第12版5-6章参考答案
- 论文模型构建的步骤_Deep Learning of Graph Matching论文解读
- javafx小球运动
- python ——word ppt 转pdf
- pt-kill 用法记录
- MetaTrader LiveUpdate 概览
- Super LRC Editor for windows-lrc歌词编辑器-正式发布
- SSM之一步一坑:将date类型存入到datetime类型数据表 时差八小时
- 智慧路灯(灯杆)物联网控制系统平台具有哪些功能和特点?