MSP432学习笔记8:定时器A_PWM驱动舵机

news/2025/2/12 22:05:19/

开发板型号:MSP432P401r

今日得以继续我的MSP432电赛速通之路,文首提供本次学习实践项目文件。

注:我笔记实践都是从原始空项目工程文件开始配置的。

有道是        —_—_—_—_—

“山无重数周遭碧,花不知名分外娇”    “曲中人不见,江上数峰青” .........

连绵不绝的山峦,起伏有序,高峰紧薄低谷,诗意酝在其中。

  像极了我们今日要学习的——定时器PWM输出

目录

空项目传送门:

上篇文章 定时器A中断  传送门:

本篇文章实践项目传送门:

基础知识:

MSP432定时器A对应引脚图:

定时器输出PWM相关库函数:

定时器输出PWM一般步骤:

1.配置GPIO复用:

2.配置结构体:

对于PWM的频率占空比的计算,我们可以通过以下公式进行计算:

3.初始化定时器:

尝试驱动舵机:

以下是我的9g舵机,以及驱动原理:

以下为舵机控制有关的源码:

以下为成功下载测试视频:


空项目传送门:

https://download.csdn.net/download/qq_64257614/87781382?spm=1001.2014.3001.5503

上篇文章 定时器A中断  传送门:

MSP432学习笔记7:定时器A中断_NULL指向我的博客-CSDN博客

本篇文章实践项目传送门:

https://download.csdn.net/download/qq_64257614/87825804?spm=1001.2014.3001.5503

基础知识:

之前在学习定时器A中断时,我们知道它有三种计数模式:

但在学习PWM输出时,我们只需关心 一和三 这俩种计数模式即可。

 定时器A有七种输出模式,但常用的也就模式2与模式6:

 我们可以发现模式2与模式6这俩个模式是互补的:

这是增计数模式下的输出:

 这是增减计数模式下的输出:

当同时使能主通道和互补通道,就可以输出互补对称波形

这样俩种输出模式配合后,能生成带死区的互补PWM:

评估板一共有四个定时器A :TA0   TA1   TA2   TA3

每个定时器都有五个通道: CCR0   CCR1   CCR2   CCR3   CCR4  

MSP432定时器A对应引脚图

定时器输出PWM相关库函数:

以下库函数封装在 timer_a.h 文件中:

1.初始化定时器为PWM模式:

参数填选择的定时器以及配好的结构体地址

Timer_A_generatePWM(TIMER_Ax_BASE,&TimAx_PWMConfig);

2.改变比较值(占空比/周期):

 通过改变CCR来改变定时器周期(与定时器中断通用)

Timer_A_setCompareValue(TIMER_Ax,COMPARE_REGISTER_x,CCR);

定时器输出PWM一般步骤:

0.配置时钟

1.配置GPIO复用

2.配置结构体

3.初始化定时器

1.配置GPIO复用:

我还是比较喜欢将初始化的过程都封装在一个初始化函数

进行统一分类编写:

先定义一个函数,在逐步添加初始化语句:

此处初始化的是PA1.1 就是P7.7脚。

//1.配置GPIO复用GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P7,GPIO_PIN7,GPIO_PRIMARY_MODULE_FUNCTION);

2.配置结构体:

此结构体定义在 Timer_a.h文件中

复制该结构体中的参数:

 粘贴在刚才的初始化函数那:

 修改语句,配置结构体参数:

//2.配置结构体
Timer_A_PWMConfig TimA1_PWMConfig;																
TimA1_PWMConfig.clockSource=TIMER_A_CLOCKSOURCE_SMCLK;						
TimA1_PWMConfig.clockSourceDivider=48;		
TimA1_PWMConfig.timerPeriod=19999;														
TimA1_PWMConfig.compareRegister=TIMER_A_CAPTURECOMPARE_REGISTER_1;
TimA1_PWMConfig.compareOutputMode=TIMER_A_OUTPUTMODE_TOGGLE_SET;	
TimA1_PWMConfig.dutyCycle=9999;	

以上结构体配置产生的是50Hz的方波, 就是0.05s/次

对于PWM的频率占空比的计算,我们可以通过以下公式进行计算:


- PWM频率 时钟源频率  /  (时钟源除数值“时钟分频”  *  (CCR0值“自动重载值” + 1))   

单位:  Hz  

PWM=48000000/(48*(19999+1))=50Hz

- 占空比 = (CCR1值 / CCR0值) * 100%

其中CCR0值是计数器最大计数值,

CCR1值是计数器计数到某个值时,输出PWM的占空比的相对值。

例如,如果要设置PWM频率为10kHz,时钟源频率为48MHz,时钟除数值为8,则CCR0值为4800。如果要设置占空比为50%,则CCR1值为2400。

此处方波为 50%占空比,所以计算公式为:CCR1 占空比=(CCR0值“自动重载值” + 1 )  /  2  -  1   =9999

3.初始化定时器:

 填上定时器A1,以及配置好的结构体地址:

	//初始化定时器:Timer_A_generatePWM(TIMER_A1_BASE,&TimA1_PWMConfig);

尝试驱动舵机:

以上配置完结后,下载程序我们就能尝试驱动舵机了:

此云台俩个舵机规格相同,此处我只配置驱动一个舵机了,

以下是我的9g舵机,以及驱动原理:

注:不同品牌舵机驱动原理不同,需要不同电压和信号频率

       使用舵机不要超载、超速,以免损坏舵机

以下为商家给的说明:

舵机的控制一般需要一个20ms左右的时基脉冲,
该脉冲的高电平部分一般为0.5ms-2.5ms
范围内的角度控制脉冲部分,
总间隔为2ms。
以180度角度伺服为例,
那么对应的控制关系是这样的:0.5ms--------------0度;1.0ms------------45度;1.5ms------------90度;2.0ms-----------135度;2.5ms-----------180度

我们将其转换为占空比,那就是:

2.5%          占空比————      0度

5%             占空比————      45度

7.5%          占空比————      90度

10%           占空比————      135度

12.5%        占空比————      180度

该信号以方波形式发出。

总长20ms(0.02s)其实就是表示 频率为 50Hz

因此,我们只需在上面配置好的函数那 调整好 占空比即可!

以下为舵机控制有关的源码:

#include "sysinit.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "tim32.h"
#include "delay.h"#define CLKDIV 48
#define CCR0 19999
#define CCR1_MIN 500
#define CCR1_MAX 2500void TimerA0_PWM_inint(void);int main(void)
{bool dir=1;uint16_t i;SysInit();         // 第3讲 时钟配置uart_init(115200); // 第7讲 串口配置delay_init();      // 第4讲 滴答延时TimerA0_PWM_inint();printf("Hello,MSP432!\r\n");MAP_Interrupt_enableMaster(); // 开启总中断while (1){delay_ms(500);if(dir) i+=500;else    i-=500;if(i==CCR1_MAX)       {dir=0; delay_ms(50);}else if(i==CCR1_MIN)  {dir=1; delay_ms(50);}MAP_Timer_A_setCompareValue(TIMER_A1_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_1,i);}
}

我们可以看到,全局变量#define了俩个变量:

#define CCR1_MIN 500
#define CCR1_MAX 2500

分别对应 0度 和 180度 的 占空比下,CCR1的值

该转换分度为 500,每加500,占空比加 2.5%,

这个小学数学自己算,我不教大家了哈~~~~~~~~

bool  dir就是判断有没有到最大最小边界的,

然后每次加减都要有个500MS延时等待,以保证舵机确实转过这么多角度了。

里面最重要的还是改变比较值(占空比/周期)函数:

MAP_Timer_A_setCompareValue(TIMER_A1_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_1,i);

以下为成功下载测试视频:

MSP432P401r驱动舵机视频


http://www.ppmy.cn/news/106051.html

相关文章

数据采集技术的实现原理有哪些?

数据采集技术是指通过各种手段和技术手段,从互联网、移动设备、传感器等各种数据源中获取数据,并将其存储、处理和分析,以便为业务决策和应用提供支持。本文将介绍数据采集技术的实现原理,包括数据采集的基本流程、数据采集技术的…

【图像水印 2022 ACM】PIMoG

【图像水印 2022 ACM】PIMoG 论文题目:PIMoG: An Effective Screen-shooting Noise-Layer Simulation for Deep-Learning-Based Watermarking Network 中文题目:PIMoG:深度学习水印网络中一种有效的截屏噪声层仿真 论文链接:https://dl.acm.o…

LeetCode 1110. 删点成林

【LetMeFly】1110.删点成林 力扣题目链接:https://leetcode.cn/problems/delete-nodes-and-return-forest/ 给出二叉树的根节点 root,树上每个节点都有一个不同的值。 如果节点值在 to_delete 中出现,我们就把该节点从树上删去&#xff0c…

NLP语料库学习

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言中文语料库 前言 提示:这里可以添加本文要记录的大概内容: 语料库有的是标记过的(annotated),意味…

企业数字化转型,关于数据应用的三点分析

企业数字化转型已经成为当今商业领域的热门话题。在这个信息爆炸的时代,企业意识到数据的价值,开始将其作为一种战略资源来应用。数据应用是企业数字化转型中至关重要的一环,以下是关于数据应用的三点分析。 首先,数据应用为企业提…

家政服务预约APP的系统设计与实现

摘 要:针对家政行业蓬勃发展,老套的家政服务方式已经跟不上互联网时代的步伐这个问题。基于Android移动平台的分析和设计过程、C/S模式、Eclipse平台,采用Java语言进行开发设计,设计了基于MVC架构的实现方案。安卓客户端与服务器…

深入解析Spring源码系列:Day 5 - Spring事务管理原理

深入解析Spring源码系列:Day 5 - Spring事务管理原理 欢迎来到本系列的第五篇博客。在前几篇博客中,我们探讨了Spring框架的核心概念,包括Bean的生命周期、作用域和AOP原理。今天,我们将深入研究Spring框架中的事务管理原理。 事…

Idea+maven+springboot项目搭建系列--1 整合Rocketmq

前言:本文以mavenspringboot 整合Rocketmq 完成消息的发送和接收。 1 Rocketmq 介绍: 1.1 Rocketmq 特性: Apache RocketMQ是一款快速、可靠的分布式消息传递和流处理平台,具有可扩展性和高性能。它是一个分布式的、去中心化的消…