嵌入式进阶——舵机控制PWM

🎬 秋野酱:《个人主页》
🔥 个人专栏:《Java专栏》《Python专栏》

⛺️心若有所向往,何惧道阻且长

文章目录

    • 舵机信号线
    • 代码示例
      • 初始化PWM
      • 初始化UART打印日志
      • 初始化外部中断Exti
      • main函数

舵机最早用于船舶上实现转向功能,由于可以通过程序连续控制其转角,因而被广泛应用于智能小车转向以及机器人各类关节中.
工作电压:3V-7.2V(取决于具体型号)
工作电流:100mA(取决于具体型号)
在这里插入图片描述
舵机由直流电机、减速齿轮组、传感器和控制电路组成的一套自动控制系统.通过发送信号,指定输出轴旋转角度.舵机一般而言都有最大旋转角度(比如180度)
与普通直流电机的区别:
● 直流电机是一圈圈转动的
● 舵机智能在一定角度内转动,不能一圈圈转动
● 普通的直流电机无法反馈转动的角度信息,而舵机可以
用途也不相同:
● 普通直流电机一般是整圈转动做动力用
● 舵机是控制某物体转动一定角度用(比如机器人的关节)
在这里插入图片描述

舵机信号线

在这里插入图片描述

舵机的主要组成部分为伺服电机,所谓伺服就是服从信号的要求而动作。在信号来之前,转子停止不动;信号来到之后,转子立即运动。因此我们就可以给舵机输入不同的信号,来控制其旋转到不同的角度。 舵机接收的是PWM信号,当信号进入内部电路产生一个偏置电压,触发电机通过减速齿轮带动电位器移动,使电压差为零时,电机停转,从而达到伺服的效果。简单来说就是给舵机一个特定的PWM信号,舵机就可以旋转到指定的位置。 舵机上有三根线,分别是GND(棕线)、VCC(红线)和SIG(橙线),也就是地线、电源线和信号线,其中的PWM波就是从信号线输入给舵机的。
一般来说,舵机接收的PWM信号频率为50HZ,即周期为20ms。当高电平的脉宽在0.5ms-2.5ms之间时舵机就可以对应旋转到不同的角度。如下图。
在这里插入图片描述
在这里插入图片描述

代码示例

以P01对应的PWM6为例
配置PWM环境,这里需要使用修改后的,支持分频系数的PWM依赖库:

初始化PWM

#include "config.h"
#include "delay.h"
#include "GPIO.h"
#include "PWM.h"
#include "UART.h"
#include "Exti.h"
#include <stdio.h>char putchar(char dat)
{TX1_write2buff(dat);return dat;
}#define MOTOR P01// 分频系数:可以是1~65535中的任意值
#define Prescaler 10// 频率
#define PREQ 50// 保证分母 >= 367
#define PERIOD (MAIN_Fosc / (PREQ * Prescaler))void GPIO_config(void)
{GPIO_InitTypeDef GPIO_InitStructure;        // 结构定义GPIO_InitStructure.Pin = GPIO_Pin_1;        // 指定要初始化的IO,GPIO_InitStructure.Mode = GPIO_PullUp;      // 指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PPGPIO_Inilize(GPIO_P0, &GPIO_InitStructure); // 初始化GPIO_InitStructure.Pin = GPIO_Pin_2;        // 指定要初始化的IO,GPIO_InitStructure.Mode = GPIO_PullUp;      // 指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PPGPIO_Inilize(GPIO_P3, &GPIO_InitStructure); // 初始化
}void PWM_config(void)
{PWMx_InitDefine PWMx_InitStructure;// 总配置// (MAIN_Fosc / 1000) - 1 周期计数值// 配置分频系数,必须使用改进后的PWM.h和PWM.C文件PWMx_InitStructure.PWM_Prescaler = Prescaler - 1;PWMx_InitStructure.PWM_Period = PERIOD - 1; // 周期时间,   0~65535PWMx_InitStructure.PWM_DeadTime = 0;        // 死区发生器设置, 0~255PWMx_InitStructure.PWM_EnoSelect = ENO6P;   // 输出通道选择,	ENO1P,ENO1N,ENO2P,ENO2N,ENO3P,ENO3N,ENO4P,ENO4N / ENO5P,ENO6P,ENO7P,ENO8PPWMx_InitStructure.PWM_PS_SW = PWM6_SW_P01; // 切换端口// 具体PWM端口配置// pwm6PWMx_InitStructure.PWM6_Mode = CCMRn_PWM_MODE1; // 模式,		CCMRn_FREEZE,CCMRn_MATCH_VALID,CCMRn_MATCH_INVALID,CCMRn_ROLLOVER,CCMRn_FORCE_INVALID,CCMRn_FORCE_VALID,CCMRn_PWM_MODE1,CCMRn_PWM_MODE2PWMx_InitStructure.PWM6_Duty = 0;               // PWM4占空比时间, 0~Period// pwm6PWMx_InitStructure.PWM_CC6Enable = ENABLE; // 开启PWM6P输入捕获/比较输出,  ENABLE,DISABLE// PWM启动配置PWMx_InitStructure.PWM_MainOutEnable = ENABLE; // 主输出使能, ENABLE,DISABLEPWMx_InitStructure.PWM_CEN_Enable = ENABLE;    // 使能计数器, ENABLE,DISABLEPWM_Configuration(PWMB, &PWMx_InitStructure);  // 初始化PWM,  PWMA,PWMB
}

初始化UART打印日志


void UART_config(void)
{COMx_InitDefine COMx_InitStructure;              // 结构定义COMx_InitStructure.UART_Mode = UART_8bit_BRTx;   // 模式, UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTxCOMx_InitStructure.UART_BRT_Use = BRT_Timer1;    // 选择波特率发生器, BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)COMx_InitStructure.UART_BaudRate = 115200ul;     // 波特率, 一般 110 ~ 115200COMx_InitStructure.UART_RxEnable = ENABLE;       // 接收允许,   ENABLE或DISABLECOMx_InitStructure.BaudRateDouble = DISABLE;     // 波特率加倍, ENABLE或DISABLECOMx_InitStructure.UART_Interrupt = ENABLE;      // 中断允许,   ENABLE或DISABLECOMx_InitStructure.UART_Priority = Priority_0;   // 指定中断优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3COMx_InitStructure.UART_P_SW = UART1_SW_P30_P31; // 切换端口,   UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17,UART1_SW_P43_P44UART_Configuration(UART1, &COMx_InitStructure);  // 初始化串口1 UART1,UART2,UART3,UART4
}

初始化外部中断Exti

用于监听按钮P32的按下事件

void Exti_config(void)
{EXTI_InitTypeDef Exti_InitStructure;           // 结构定义Exti_InitStructure.EXTI_Interrupt = ENABLE;    // 中断使能,   ENABLE或DISABLEExti_InitStructure.EXTI_Mode = EXT_MODE_Fall;  // 中断模式,   EXT_MODE_RiseFall,EXT_MODE_FallExti_InitStructure.EXTI_Priority = Priority_0; // 中断使能,   ENABLE或DISABLEExt_Inilize(EXT_INT0, &Exti_InitStructure);    // 初始化
}

处理按钮按下事件


u16 duty_percent = 500; // 500us -> 2500us
void ext_int0_call()
{static int step = 500;float angle = 0;PWMx_Duty duty;//  500 ->   0°// 1000 ->  45°// 1500 ->  90°// 2000 -> 135°// 2500 -> 180°delay_ms(10);if (P32){// 延时10ms后,依然低电平,才执行。消除抖动return;}// 修改占空比 0 -> 100duty_percent += step;if (duty_percent >= 2500){step = -500;}else if (duty_percent <= 500){step = 500;}// 计算不同的占空比对应的角度值,用于打印angle = (duty_percent - 500) * 180.0f / 2000;printf("duty_percent: %d angle: %.1f \r\n", (int)duty_percent, angle);// 设置占空比duty.PWM6_Duty = PERIOD * duty_percent / 20000;UpdatePwm(PWMB, &duty);
}

main函数

void main()
{PWMx_Duty duty;GPIO_config();UART_config();PWM_config();Exti_config();EA = 1;P32 = 1;duty.PWM6_Duty = PERIOD * duty_percent / 20000;UpdatePwm(PWMB, &duty);while (1){delay_ms(10);}
}

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

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

相关文章

MySQL中, 自增主键和UUID作为主键有什么区别?

首先我们来看看, 存储自增主键和uuid的数据类型 我们知道, mysql中作为主键的通常是int类型的数据, 这个 数据从第一条记录开始, 从1开始主键往后递增, 例如我有100条数据, 那么根据主键排序后, 里面的记录从上往下一次就是1, 2, 3 ... 100, 但是UUID就不一样了, UUID是根据特殊…

打卡信奥刷题(21)用Scratch图形化工具信奥P7071 [CSP-J2020] 优秀的拆分

使用2进制进行拆分是比较好的解决方案&#xff0c;毕竟对于大家来说二进制转换是非常熟的&#xff0c;如果不会可以参考打卡信奥刷题&#xff08;19&#xff09;用Scratch图形化工具信奥B3972 [语言月赛 202405] 二进制 题解 &#xff0c;输出的时候再转换一下输出&#xff0c;…

M功能-支付平台(三)

target&#xff1a;离开柬埔寨倒计时-221day 前言 今天周六&#xff0c;但是在柬埔寨还是工作日&#xff0c;想着国内的朋友开始休周末就羡慕呀&#xff0c;记不清在这边过了多少个周六了&#xff0c;多到我已经习惯了。而且今天技术部还停电了&#xff0c;真的是热的受不了呀…

ASP.NET 代码审计

ASP.NET 官方文档 名词解释 IIS&#xff08;Internet Information Services&#xff09; IIS 是微软开发的一款 Web 服务器软件&#xff0c;用于在 Windows 服务器上托管和提供Web应用程序和服务。它支持 HTTP、HTTPS、FTP、SMTP 等多种协议&#xff0c;主要用于&#xff1a…

基于混合Transformer-CNN模型的多分辨率学习方法的解剖学标志检测

文章目录 Anatomical Landmark Detection Using a Multiresolution Learning Approach with a Hybrid Transformer-CNN Model摘要方法实验结果 Anatomical Landmark Detection Using a Multiresolution Learning Approach with a Hybrid Transformer-CNN Model 摘要 精确定位…

跨域计算芯片,一把被忽视的汽车降本尖刀

作者 |王博 编辑 |德新 2019年前后&#xff0c;「中央运算单元区域控制」的架构被提出。基于这一趋势&#xff0c;从板级的多芯片&#xff0c;到板级的单芯片&#xff0c;集成度越来越高&#xff0c;跨域计算芯片随之来到聚光灯下。 跨域计算芯片的特点是&#xff0c;与专为智…

牛客网刷题 | BC97 回文对称数

目前主要分为三个专栏&#xff0c;后续还会添加&#xff1a; 专栏如下&#xff1a; C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读&#xff01; 初来乍到&#xff0c;如有错误请指出&#xff0c;感谢&#xff01; 描述 今天牛牛学到了回文…

锁相环的一些学习笔记--(1)

下图两组1.2.3可以对应起来&#xff1b; 一些分析&#xff1a; 1.根据这个可知最后vco_voltage停在0.5v 参考资料&#xff1a; 1. Matlab https://www.bilibili.com/video/BV1bR4y1Z7Xg/?spm_id_from333.1296.top_right_bar_window_history.content.click&vd_source555…

如何将Windows PC变成Wi-Fi热点?这里提供详细步骤

序言 Windows 10和Windows 11都有内置功能,可以将你的笔记本电脑(或台式机)变成无线热点,允许其他设备连接到它并共享你的互联网连接。以下是操作指南。 由于Windows中隐藏的虚拟Wi-Fi适配器功能,你甚至可以在连接到另一个Wi-Fi网络或无线路由器时创建Wi-Fi热点,通过另…

鲁教版七年级数学上册-笔记

文章目录 第一章 三角形1 认识三角形2 图形的全等3 探索三角形全等的条件4 三角形的尺规作图5 利用三角形全等测距离 第二章 轴对称1 轴对称现象2 探索轴对称的性质4 利用轴对称进行设计 第三章 勾股定理1 探索勾股定理2 一定是直角三角形吗3 勾股定理的应用举例 第四章 实数1 …

Kafka 安装教程和基本操作

一、简介 Kafka 是最初由 Linkedin 公司开发&#xff0c;是一个分布式、分区的、多副本的、多订阅者&#xff0c;基于 zookeeper 协调的分布式日志系统&#xff08;也可以当做 MQ 系统&#xff09;&#xff0c;常见可以用于 web/nginx 日志、访问日志&#xff0c;消息服务等等…

基于YOLO算法实现网球运动实时分析(附源码)

大家好&#xff0c;我是小F&#xff5e; 今天给大家介绍一个计算机视觉实战的项目。 该项目使用YOLO算法检测球员和网球&#xff0c;并利用cnn提取球场关键点。 进而分析视频中的网球运动员&#xff0c;测量他们的速度、击球速度和击球次数。 使用win10电脑&#xff0c;Python …

【源码】java + uniapp交易所源代码/带搭建教程java交易所/完整源代码

java uniapp交易所源代码/带搭建教程java交易所/完整源代码 带简洁教程&#xff0c;未测 java uniapp交易所源代码/带搭建教程java交易所/完整源代码 - 吾爱资源网

【古董技术】ms-dos应用程序的结构

序 制定一个MS-DOS应用程序计划需要认真分析程序的大小。这种分析可以帮助程序员确定MS-DOS支持的两种程序风格中哪一种最适合该应用程序。.EXE程序结构为大型程序提供了好处&#xff0c;因为所有.EXE文件之前都有额外的512字节&#xff08;或更多&#xff09;的文件头。另一方…

C++第十七弹---string使用(下)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、标准库中的string类 1.1、string类的常用接口说明 1.1.1、string类对象的修改操作 1.1.2、string类对象非成员函数重载 总结 1、标准库中的…

牛客热题:有效括号

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;力扣刷题日记 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录 牛客热题&#xff1a;有效括号题目链接方法一&#x…

Mycat+Mysql搭建数据集群实现数据分片存储

前言 MyCAT介绍 * 一个彻底开源的,面向企业应用开发的“大数据库集群”; * 支持事务、ACID、可以替代MySQL的加强版数据库; * 一个可以视为“MySQL”集群的企业级数据库,用来替代昂贵的Oracle集群; * 一个融合内存缓存技术、Nosql技术、HDFS大数据的新型SQL; * 一个新颖…

2024.5.1学习记录

1、代码随想录&#xff1a;贪心刷题 2、react 高级使用( hoc render、props、函数组件、serState 传送门等) 3、游山玩水

《拯救大学生课设不挂科第四期之蓝桥杯是什么?我是否要参加蓝桥杯?选择何种语言?如何科学备赛?方法思维教程》【官方笔记】

背景&#xff1a; 有些同学在大一或者大二可能会被老师建议参加蓝桥杯&#xff0c;本视频和文章主要是以一个过来人的身份来给与大家一些思路。 比如蓝桥杯是什么&#xff1f;我是否要参加蓝桥杯&#xff1f;参加蓝桥杯该选择何种语言&#xff1f;如何科学备赛&#xff1f;等…

JavaEE之线程(7)_单例模式(设计模式概念、单例模式优点、懒汉、饿汉模式)

一、什么是设计模式&#xff1f; 单例模式是设计模式中较为常见的一种。那么&#xff0c;什么是单例模式&#xff1f; 设计模式&#xff08;Design Pattern&#xff09;都是一些相对优秀的解决方案&#xff0c;很多问题都是典型的、有代表性的问题&#xff0c;学习设计模式&am…