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

news2024/11/25 22:37:36

开发板型号: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 2500


void 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.coloradmin.cn/o/587655.html

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

相关文章

行为型设计模式02-模板方法模式

🧑‍💻作者:猫十二懿 🏡账号:CSDN 、个人博客 、Github 🎊公众号:猫十二懿 模板方法模式 1、模板方法模式介绍 模板方法模式是一种行为型设计模式,定义了一个算法的框架&#xff0…

现代化个人博客系统 ModStartBlog v7.4.0 暗黑模式跟随系统,随机博客获取

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用,支持后台一键快速安装,让开发者能快的实现业务功能开发。 系统完全开源,基于 Apache 2.0 开源协议。 功能特性 丰富的模块市场,后台一键快速安装 …

基于GMM的一维时序数据平滑算法

本文将介绍我们使用高斯混合模型(GMM)算法作为一维数据的平滑和去噪算法。 假设我们想要在音频记录中检测一个特定的人的声音,并获得每个声音片段的时间边界。例如,给定一小时的流,管道预测前10分钟是前景(我们感兴趣的人说话),然…

OSPF协议知识点

OSPF 七种状态机 down--- 关闭状态 ---- 一旦启动了 OSPF 协议,则发出 hello 包,并进入下一状态 init---- 初始化状态 ---- 收到的 hello 包中,存在自己的 RID 值,则进入下一状态 2-way---- 双向通讯状态 ----- 邻居关系建立的…

Linux kernel调试 SPI NORFLASH--W25Q128

W25Q128介绍 W25Q128 是华邦公司推出的一款 SPI 接口的 NOR Flash 芯片,其存储空间为 128Mbit,相当于 16M 字节。W25Q128 可以支持 SPI 的模式 0 和模式 3,也就是 CPOL0/CPHA0 和CPOL1/CPHA1 这两种模式。      Flash 写入数据时和 EEPR…

【Linux初阶】基础IO - 文件操作(使用系统接口实现) | vim批量注释代码

🌟hello,各位读者大大们你们好呀🌟 🍭🍭系列专栏:【Linux初阶】 ✒️✒️本篇内容:重新理解文件和文件操作,C语言实现的简单文件操作,文本初始权限,系统接口介…

【spring源码系列-01】spring底层源码整体概述

JVM系列整体栏目 内容链接地址【一】spring源码整体概述https://blog.csdn.net/zhenghuishengq/article/details/130940885 初识虚拟机与java虚拟机 一,spring源码整体概述1,初步概述2,扩展点机制3,核心方法refresh4,B…

【wpf】xaml 中的参数复用

背景 xaml中有几种复用的方式: 有时在xaml中,我们需要复用一些参数,比如 固定的一个值。 有时是固定的一个样式。 资源,sys的引入 有时多个控件都要设置一个高度,我可以引入sys 声明 我就使用这个吧&#xff1a…

扬帆出海正当时,企业应该做好哪些准备?

在跨境出海的时代大潮中,想要拓展海外市场的中国企业,应该事先做好哪些准备? 中国企业出海的新格局 首先来看一组令人振奋的数据。来自中国信通院的数据显示,在2020年的时候,中国数字经济的规模就达到了39.2万亿元人民…

本地Linux搭建web服务并发布公网访问

文章目录 前言1. 本地环境服务搭建2. 局域网测试访问3. 内网穿透3.1 ubuntu本地安装cpolar内网穿透3.2 创建隧道3.3 测试公网访问 4. 配置固定二级子域名4.1 保留一个二级子域名4.2 配置二级子域名4.3 测试访问公网固定二级子域名 转载自cpolar极点云的文章:在Ubunt…

玩转华为云Astro低代码体验季

目录 Astro轻应用应用场景 零代码应用构建 轻应用构建 行业应用构建 业务大屏构建 使用体验 功能建议 总体评价 Astro轻应用(Astro Zero,简称AstroZero)是华为云为行业客户、合作伙伴、开发者量身打造的低代码/零代码应用开发平台&#xff0c…

C++ A lambda function

lambda 函数是 C 中的匿名函数,可以内联定义并用作函数对象。 下面是定义 lambda 函数的一般语法: [capture list] (parameter list) -> return type { function body }lambda 语法的每个部分: - capture list:这是一个可选的…

R实践——【rgplates】功能函数解析

【rgplates】功能函数解析 1. 板块和特征重建2. 构造模型表示2.1 用法2.2 参数2.3 值2.4 示例 3. 实用工具3.1 用法3.2 参数3.3. 值3.4 示例 1. 板块和特征重建 一切与几何形状重建到过去状态有关的东西 reconstruct():重建地理特征 详见R语言实践——古今地理坐…

4. WebGPU 存储缓冲区 (WebGPU Storage Buffers)

这篇文章是关于存储缓冲区的&#xff0c;我们从上一篇文章暂停的地方继续。 存储缓冲区在许多方面类似于统一缓冲区。如果我们所做的只是将 JavaScript 中的 UNIFORM 更改为 STORAGE 并将 WGSL 中的 var 更改为 var<storage, read> &#xff0c;那么上一页中的示例就可以…

Zabbix“专家坐诊”第193期问答汇总

问题一 Q&#xff1a;大佬们&#xff0c;怎么才能将zabbix-server接收到的数据全部展示出来呢&#xff1f;目前我的显示数据无法全部显示。 A&#xff1a;这个是用zabbix_sender发送过来的&#xff1f;确认下数据中是否包含空格等&#xff0c;如果有空格使用反斜杠转义或者单…

uniapp内置组件

目录 3.1、视图容器 view scroll-view swiper match-media 3.2、表单组件 form input App平台iOS端软键盘上方横条去除方案 关于软键盘弹出的逻辑说明 关于软键盘收起的逻辑说明 picker 3.3、 路由与页面跳转 navigator组件 3.4、 地图 map 3.1、视图容器 所有…

2.5. 重载与覆盖

在 Java 中&#xff0c;方法的重载&#xff08;Overloading&#xff09;和覆盖&#xff08;Overriding&#xff09;是两个重要的概念。它们都涉及到方法的定义与使用&#xff0c;但作用和规则有所不同。 重载&#xff08;Overloading&#xff09; 重载是指在同一个类中定义多…

2023年6月18日DAMA-CDGA/CDGP数据治理认证报名到这里

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

在家远程使用公司用友ERP财务软件 【远程办公】

文章目录 前言1.本地访问简介2. cpolar内网穿透3. 公网远程访问4. 固定公网地址 转发自cpolar极点云的文章&#xff1a;外网远程访问公司内网用友畅捷通T财务软件 – 远程办公 前言 用友畅捷通T适用于异地多组织、多机构对企业财务汇总的管理需求&#xff1b;全面支持企业对远…

webpack简单的搭建和使用(1)

随便创建一个空的文件夹&#xff0c;例如说&#xff1a;explore 然后我们测试一下我们的node是否存在 可以正确打印出版本 我们再次输入&#xff1a;npm init -y 创建一个package.json文件 出现这样的情况就成功了 然后我们要安装webpack在终端上输入命令&#xff1a; npm i …