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

news2024/10/6 8:21:53

开发板型号: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/573582.html

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

相关文章

Linux驱动入门(三)——源码下载阅读、分析和嵌入式文件系统介绍

文章目录 从内核出发获取内核源码使用Git安装内核源码使用补丁 阅读Linux内核源码Source Insight简介阅读源码 内核开发的特点无libc库抑或无标准头文件GNU C没有内存保护机制不要轻易在内核中使用浮点数容积小而固定的栈同步和并发可移植性的重要性 Linux源码分析Linux源码结构…

每日一题——用两个队列实现栈

每日一题 用两个队列实现栈 题目链接 思路 这里主要讲怎么实现出栈StackPop操作做完用两个栈实现队列,我们可能会想当然的认为,这一题也是一个主队列,一个辅助队列,当要出队时,首先判断辅助队列是否为空,…

代码线程安全

线程生命周期 synchronized synchronized会自动释放锁 synchronized同步代码块 synchronized后面括号里obj是锁对象(保证唯一);static修饰的obj对象是自定义MyThread线程类的静态成员变量,该自定义线程类所有实例共享保证锁对象唯一性;另一…

广度优先搜索

注:最近有些事所以请大家原谅 那么废话讲完了┏ (゜ω゜)☞ 目录 一:认识广搜 广度优先搜索算法的搜索步骤一般是: 二:导入 广度优先搜索一般可以回答两类问题: 三:基础应用 例题1:寻宝…

Electron 入门案例详解

目录 前言一、开发环境检查二、入门案例实现1.初始化项目2.安装electron包3.运行electron应用 三、创建第一个应用窗口1.准备页面2.创建窗口3.运行窗口 总结 前言 Electron 是一种基于 Node.js 和 Chromium 的框架,可以方便地创建跨平台的桌面应用程序。虽然 Elect…

jlink-v8刷固件及解决keil报错 j-link is defective,j-link clone

今天在调试STM32F407的程序时,下载程序时突然keil识别不到jlink了,还以为是驱动的问题,重新装了好几次驱动,结果还是不行,于是就网上找各种办法,最后决定重新刷固件。网上的方法很多,好多都失败…

Kotlin Compose Multiplatform 跨平台(Android端、桌面端)开发实践之使用 SQLDelight 将数据储存至数据库

前言 关于标题和文章主题 取标题的时候我还在想,我应该写 Compose 跨平台呢还是写 Kotlin 跨平台。 毕竟对于我的整体项目而言,确实是 Compose 跨平台开发,但是对于我这篇文章要说的东西,那其实也涉及不到多少 Compose 相关的内…

力扣sql中等篇练习(二十七)

力扣sql中等篇练习(二十七) 1 连续两年有3个及以上订单的产品 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # Write your MySQL query statement below WITH T as (SELECT t.product_id,t.d,count(order_id) numFROM(SELECT order_id,product_id,…

es elasticsearch 九 索引index 定制分词器 type结构后期弃用原因 定制动态映射 动态映射模板 零停机重建索引

目录 索引index 定制分词器 Type底层结构及弃用原因 定制 dynamic mapping 定制dynamic mapping template 动态映射模板 零停机重建索引 生产环境应该度别名数据 索引index Put /index Stings 分片 Mapping 映射 Aliases 别名 增加 Put my_index2 { "se…

网络安全行业在经济下行期仍然稳步增长,快抓住风口入行

根据IDC《2022年第四季度中国IT安全软件市场跟踪报告》的数据,2022年下半年中国IT安全软件市场厂商整体收入约为23.8亿美元(约合165.7亿元人民币),同比上升12.4%。结合全年数据,2022全年中国IT安全软件市场规模达到39.…

NodeJS 文件操作④

文章目录 ✨文章有误请指正,如果觉得对你有用,请点三连一波,蟹蟹支持😘前言NODE内置模块 FS模块 CallBack API mkdir (创建文件夹 异步) rmdir(删除文件夹 异步) rm&#…

百度爱番番的线索如何自动导入至CRM系统中?

百度爱番番是什么? 百度爱番番是应用百度强大AI能力,帮助企业实现营销数字化、自动化、智能化,为企业提供拓客、集客、管客的一站式智能解决方案,助力企业营销变得专业且智能。 百度爱番番的线索如何自动导入至CRM系统中&#xf…

MKS SERVO4257D 闭环步进电机_系列2 菜单说明

第1部分 产品介绍 MKS SERVO 28D/35D/42D/57D 系列闭环步进电机是创客基地为满足市场需求而自主研发的一款产品。具备脉冲接口和RS485/CAN串行接口,支持MODBUS-RTU通讯协议,内置高效FOC矢量算法,采用高精度编码器,通过位置反馈&am…

数据结构和算法,在Python中的实现方式

部分数据来源:ChatGPT 数据结构 在计算机科学中,数据结构指的是计算机中用来存储和组织数据的方式。数据结构是为算法服务的,同一个算法在不同的数据结构上运行效率可能会有很大的不同。这就要求我们在解决问题时要根据具体情况选择合适的数…

前端中间件Midway的使用

一、 关于midway1. 解决什么痛点2. 期望达到什么效果 二、创建应用并使用1. 创建midway应用2. 认识Midway2.1 目录结构2.2 Controller2.3 路由2.4 获取请求参数2.5 Web中间件2.6 组件使用2.7 服务(service) 三、写到最后 一、 关于midway Midway 是阿里巴巴 - 淘宝前端架构团队…

别做重复低质的工作内容摸鱼了,18k大佬分享自动化测试秘籍

自动化测试面试真题(附答案) 一、编程语法题 1、python有哪些数据类型 2、怎么将两个字典合并 3、python 如何将json写到文件里? 4、 __init__和_new__区别? 5、什么是可变、不可变类型? 6、mysql注入点,用工具对目标站直接写入…

IDEA操作数据库并设置时区

目录 设置mysql的时区的方法(提供三种选择) 1、直接在advanced上配置serverTimezone属性值(单次连接有效) 2、进入MySQL客户端修改time_zone 3、直接修改MySQL的my.ini配置文件设置time-zone 使用Database 1、查看当前数据源…

uCOSii信号量的作用

uCOSii中信号量的作用: 在创建信号量时,Sem_EventOSSemCreate(1)用于分时复用共享资源; Sem_EventOSSemCreate(0)用于中断和任务间同步或任务之间的同步。 具体在使用时,需要灵活运用。在访问共享资源时,我喜欢用互…

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(5月26日论文合集)

文章目录 一、检测相关(9篇)1.1 Energy-based Detection of Adverse Weather Effects in LiDAR Data1.2 Anomaly Detection with Conditioned Denoising Diffusion Models1.3 Mask Attack Detection Using Vascular-weighted Motion-robust rPPG Signals1.4 Improved Multi-Sca…

AccessShareLock pg cancel backend terminate backend

AccessShareLock 在PostgreSQL中,AccessShareLock是一种用于控制对数据库对象并发访问的锁类型。它是一种读锁,允许多个事务同时从同一个对象进行读取,但它阻止并发事务获取冲突的锁,比如写锁或独占锁。 当一个事务在对象上获取…