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);
}

实验结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/400832.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Key_EXTI_Config:神舟IV

GPIO 输入上拉,按键按下,pin接地,触发中断 Key_Config 1 void Key_Config(void)2 {3 GPIO_InitTypeDef GPIO_InitStructure;4 5 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);6 7 /* Configure KEY1 Button PC4*/8 RCC_APB2…

Java 将HTML转为XML

🚀 优质资源分享 🚀 学习路线指引(点击解锁)知识定位人群定位🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一…

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

目录硬知识Timer_B特点及结构Timer_B寄存器定时器B API处理计时器配置和控制的函数参数处理计时器输出的函数参数管理定时器B中断的函数参数平台:Code Composer Studio 10.3.1 MSP430F5529 LaunchPad™ Development Kit (MSP‑EXP430F5529LP) 硬知识 16位定时器B(…

ruoyi接口权限校验

🚀 优质资源分享 🚀 学习路线指引(点击解锁)知识定位人群定位🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一…

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

目录硬知识模数转换概述MSP430单片机ADC12模块介绍MSP430单片机ADC12模块操作ADC12的转换模式采样和转换转换存储器使用片内集成温度传感器ADC12模块寄存器ADC_12A API (机翻)处理初始化和转换的函数参数处理中断的函数参数处理ADC_12A的辅助功能的函数参数上机实战&#xff08…

有意思的鼠标指针交互探究

🚀 优质资源分享 🚀 学习路线指引(点击解锁)知识定位人群定位🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一…

python基本数据类型——str

一、字符串的创建 test str() / "" test str("licheng") / "licheng" 无参数,创建空字符串一个参数,创建普通字符串两个参数,int(字节,编码)二、字符串的常用方法 #capita…

MSP430F5529 DriverLib 库函数学习笔记(九)SPI

目录硬知识USCI的同步模式SPI概述SPI特性及结构框图同步操作原理与操作USCI寄存器——SPI模式USCI_x_SPI API (机翻)处理状态和初始化的函数参数处理数据的函数参数管理中断的函数参数DMA相关参数平台:Code Composer Studio 10.3.1 MSP430F5…

轻松上手Fluentd,结合 Rainbond 插件市场,日志收集更快捷

🚀 优质资源分享 🚀 学习路线指引(点击解锁)知识定位人群定位🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一…

深入理解Threadlocal

SUN公司早在JDK1.2的时候就为我们提供了java.lang.ThreadLocal,低版本的JDK所提供的get()返回的是Object对象,需要强制类型转换,使用起来不方便,而在JDK1.5引入了泛型,在一定程度地简化ThreadLocal的使用。 我们知道在spring容器中…

HDU 2289 几何+圆台

题意;给定一个圆台杯子的R&#xff0c;r&#xff0c;H和里面水的体积V 求h 二分。。。。。。。。。。。。。。。。。 因为解不出来h。。。。。。。。。。。。 View Code 1 /*2 几何3 圆台体积4 V1/3*pi*h*(r1*r1r2*r2r1*r2)5 6 */7 #include<stdio.h>8 #include<stri…

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

目录上机实战SPI 驱动 墨水屏墨水屏介绍电子纸的分类电泳型电子纸技术详解原理结构优势与不足实验电路介绍程序分析引脚初始化SPI模块初始化发送和接收全部源代码main.cmain.h墨水屏相关Paper_Display.cPaper_Display.hInclude.h实验结果现象波形对应平台&#xff1a;Code Comp…

Xamarin开发IOS笔记:切换输入法时输入框被遮住

在进行IOS开发的过程中&#xff0c;出现类似微信朋友圈的交互界面&#xff0c;当用户遇到感兴趣的内容可以进行评论。为了方便评论输入&#xff0c;当出现评论输入框的时候自动将评论输入框移动至键盘的上方&#xff0c;这样方便边输入边查看。 当用户隐藏键盘或者切换输入法的…

技术管理进阶——你了解成长的全貌吗?

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

MSP430F5529 DriverLib 库函数学习笔记(十一)I2C / IIC

目录硬知识USCI的I2C模式I2C概述MSP430单片机I2C模块特征及结构框图I2C原理I2C主从操作&#xff08;1&#xff09;从模式&#xff08;2&#xff09;主模式I2C模式下的USCI中断USCI寄存器—I2C模式I2C API (机翻)API介绍主机模式主机模式单字节传输主机模式多字节传输主机模式单…

使用 Abp.Zero 搭建第三方登录模块(一):原理篇

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

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

目录上机实战I2C给 DAC 芯片 DAC7571 写入数字量DAC7571 介绍程序分析引脚复用I2C 初始化发送一个字节发送一个字读取一个字节读取多个字节中断服务函数整体代码main.cMSP430F5529_I2C.cMSP430F5529_I2C.h实验结果I2C 读取 TMP421 温度TMP421 简介程序摘要TMP421初始化温度的读…

mysqldump造成Buffer Pool污染的研究 [转]

原文链接&#xff1a;http://www.shaoqun.com/m/a/43307.aspx 前言&#xff1a; 最近Oracle MySQL在其官方Blog上贴出了 5.6中一些变量默认值的修改。其中innodb_old_blocks_time 的默认值从0替换成了1000&#xff08;即1s&#xff09; 关于该参数的作用摘录如下&#xff1a; h…

自动加载缓存框架

2019独角兽企业重金招聘Python工程师标准>>> 自动加载缓存框架 代码&#xff0c;请访问github 获取更详情&#xff0c;更新的内容 QQ交流群:429274886&#xff0c;版本更新会在群里通知&#xff0c;能了解最新动态 0.5版本已经是稳定版本了&#xff0c;大家可以放心…

(数据科学学习手札139)geopandas 0.11版本重要新特性一览

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…