目录

  • 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波相关推荐

  1. MSP430F5529 DriverLib 库函数学习笔记(十六)比较器B Comp_B

    目录 硬知识 比较器B介绍 比较器 B 的特点 比较器 B 的结构 模拟输入部分 比较部分 基准电压部分 低通滤波部分 比较器和普通运放的区别 比较器B测量电阻原理 利用比较器B实现电容触摸按键原理 ...

  2. MSP430F5529 DriverLib 库函数学习笔记(十四)看门狗定时器 (WDT)

    目录 硬知识 看门狗定时计数器 (WDTCNT) 看门狗模式 定时计数模式 看门狗定时器中断 时钟故障保护功能 低功耗模式下的看门狗操作 看门狗定时器控制寄存器 WDT_A API (机翻) 参数 上 ...

  3. MSP430F5529 DriverLib 库函数学习笔记(五)定时器A

    目录 硬知识 定时器A 16位定时器原理 (1)时钟源选择和分频器 (2)Timer_A工作模式 (3)捕获/比较模块 (4)Timer_A中断(重要) 定时器A API (机翻) 定时器A配置和控制 ...

  4. MSP430F5529 DriverLib 库函数学习笔记(七)定时器B

    目录 硬知识 Timer_B特点及结构 Timer_B寄存器 定时器B API 处理计时器配置和控制的函数 参数 处理计时器输出的函数 参数 管理定时器B中断的函数 参数 平台:Code Compos ...

  5. MSP430F5529 DriverLib 库函数学习笔记(八)模数转换模块(ADC12)

    目录 硬知识 模数转换概述 MSP430单片机ADC12模块介绍 MSP430单片机ADC12模块操作 ADC12的转换模式 采样和转换 转换存储器 使用片内集成温度传感器 ADC12模块寄存器 AD ...

  6. MSP430F5529 DriverLib 库函数学习笔记(十二)I2C实战

    目录 上机实战 I2C给 DAC 芯片 DAC7571 写入数字量 DAC7571 介绍 程序分析 引脚复用 I2C 初始化 发送一个字节 发送一个字 读取一个字节 读取多个字节 中断服务函数 整体代 ...

  7. MSP430F5529 DriverLib 库函数学习笔记(十)SPI驱动墨水屏

    目录 上机实战 SPI 驱动 墨水屏 墨水屏介绍 电子纸的分类 电泳型电子纸技术详解 原理 结构 优势与不足 实验电路介绍 程序分析 引脚初始化 SPI模块初始化 发送和接收 全部源代码 main.c ...

  8. MSP430F5529 DriverLib 库函数学习笔记(四点五)printf打印输出

    目录 代码实现 使相应工程支持打印浮点数 实验结果 平台:Code Composer Studio 10.3.1 MSP430F5529 LaunchPad™ Development Kit (MSP ...

  9. MSP430F5529 DriverLib 库函数学习笔记(四)UART通信

    目录 硬知识 USCI通信模块 USCI的UART模式 1. USCI初始化和复位 2. 异步通信字符格式 3. 异步多机通信模式 4. 自动波特率检测 5. IrDA编码和解码 6. 自动错误检测 ...

最新文章

  1. 二级级联菜单---纯js实现
  2. [云炬创业学笔记]第二章决定成为创业者测试4
  3. Silverlight的报表查看器
  4. 【Pytorch神经网络实战案例】03 CIFAR-10数据集:Pytorch使用GPU训练CNN模版-测试方法
  5. 将你一张表的值覆盖_精准度可达亚米级,山东“北斗一张网”向社会免费开放...
  6. ApacheCN/iBooker 未来计划 2019.11
  7. 科比职业生涯数据分析
  8. 英国正在大举进军AI,看懂其三大投资走向
  9. 十大管理之项目干系人管理知识点
  10. 宝塔linux怎么安装asp网站,宝塔面板创建网站:宝塔linux面板添加网站详细教程...
  11. Windows搭建web站点:免费内网穿透发布至公网 1-2
  12. AP计算机科学第12版5-6章参考答案
  13. 论文模型构建的步骤_Deep Learning of Graph Matching论文解读
  14. javafx小球运动
  15. python ——word ppt 转pdf
  16. pt-kill 用法记录
  17. MetaTrader LiveUpdate 概览
  18. Super LRC Editor for windows-lrc歌词编辑器-正式发布
  19. SSM之一步一坑:将date类型存入到datetime类型数据表 时差八小时
  20. 智慧路灯(灯杆)物联网控制系统平台具有哪些功能和特点?

热门文章

  1. wndows系统命令总结
  2. svn怎么上传文件 — 百度经验无耻推广
  3. MVC应用程序显示RealPlayer(rm)视频
  4. DB2在linux安装
  5. 实现klib_使用klib加速数据清理和预处理
  6. Keras框架:Alexnet网络代码实现
  7. 1109. 航班预订统计
  8. 深入理解InnoDB(7)—系统表空间
  9. leetcode 1207. 独一无二的出现次数(map+set)
  10. tdd测试驱动开发课程介绍_测试驱动开发的实用介绍