32单片机基础:PWM驱动舵机,直流电机

PWM驱动舵机 

接线图如上图所示。注意,舵机的5V 线不能接到面包板上的正极,面包板上的正极只有3.3V,是STM32提供的,所以要接到STLINK的5V,

我们如何驱动舵机呢?由之前我们介绍原理知道,要输出如下图对应的PWM波形才行,只要你的波形能按照这个规定,准确的输出,就能驱动

在上次PWM驱动呼吸灯的基础上改一下,我们现在电路图连接的是PA1口的通道2,这里GPIO的初始化时,改为GPIO_Pin_1,可以从引脚定义表去看看,呼吸灯是使用PA0引脚,所以是定时器2的通道1,但是PA1是用的定时器2的通道2,所以要把TIM_OC1Init改为OC2.

TIM_OC2Init(TIM2,&TIM_OCInitStructure);

如果通道1和通道2都想用的话,就直接初始化两个通道,比如

TIM_OC2Init(TIM2,&TIM_OCInitStructure);TIM_OC1Init(TIM2,&TIM_OCInitStructure);

这样就能同时使用两个通道来输出PWM了,同理,通道3与通道4也是可以使用的。

那对于同一个定时器的不同通道输出的PWM,他们的频率,因为不同通道是共用一个计数器的,所以他们的频率必须是一样的。它们的占空比,由各个的CCR决定,所以占空比可以各自设定,

还有它们的相位,由于计数器更新,所有PWM同时跳变,所以它们的相位是同步的。这就是同一个定时器不同通道输出PWM的特点,如果驱动多个舵机或者直流电机,那使用同一个定时器不同通道的PWM,就完全可以了。 

 最后,把改的CCR全部变为通道2.

 然后根据舵机计算公式设置CCR,PSC,ARR.

 

最后代码如下:所用的所有模块如下

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Servo.h"
#include "Key.h"uint8_t KeyNum;
float Angle;int main(void)
{OLED_Init();Servo_Init();Key_Init();OLED_ShowString(1, 1, "Angle:");while (1){KeyNum = Key_GetNum();if (KeyNum == 1){Angle += 30;if (Angle > 180){Angle = 0;}}Servo_SetAngle(Angle);OLED_ShowNum(1, 7, Angle, 3);}
}

 Servo.c

#include "stm32f10x.h"                  // Device header
#include "PWM.h"void Servo_Init(void)
{PWM_Init();
}void Servo_SetAngle(float Angle)
{PWM_SetCompare2(Angle / 180 * 2000 + 500);
}

Servo.h

#ifndef __SERVO_H
#define __SERVO_Hvoid Servo_Init(void);
void Servo_SetAngle(float Angle);#endif

 其他的模块都在前面的博客有,自己可以去找一下,后面我会全部整理在一起。

PWM驱动直流电机

接线图:

代码如下:

所有模块如下:

main.c

#include "stm32f10x.h"                  // Device header              
#include "Delay.h"
#include "OLED.h"
#include "Motor.h"
#include "Key.h"uint8_t KeyNum;
int8_t Speed;int main(void)
{OLED_Init();Motor_Init();Key_Init();OLED_ShowString(1,1,"Speed:");while(1){KeyNum=Key_GetNum();if(KeyNum==1){Speed+=20;if(Speed>100){Speed=-100;}}Motor_SetSpeed(Speed);OLED_ShowSignedNum(1,7,Speed,3);}
}

Mortor.c

#include "stm32f10x.h"                  // Device header
#include "PWM.h"void Motor_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5;//方向控制脚GPIO_Init(GPIOA, &GPIO_InitStructure);PWM_Init();
}void Motor_SetSpeed(int8_t Speed)
{if(Speed>=0){GPIO_SetBits(GPIOA, GPIO_Pin_4);GPIO_ResetBits(GPIOA, GPIO_Pin_5);PWM_SetCompare3(Speed);}else{GPIO_ResetBits(GPIOA, GPIO_Pin_4);GPIO_SetBits(GPIOA, GPIO_Pin_5);PWM_SetCompare3(-Speed);}
}

Mortor.h

#ifndef __OLED_H
#define __OLED_H
void Motor_Init(void);
void Motor_SetSpeed(int8_t Speed);#endif

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

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

相关文章

workstation 用途

一 workstation 用途 强大的桌面虚拟化 允许创造多种操作系统可以不用重启就跨不同操作系统进行操作可以提供隔离的安全环境 连接到vsphere 可以远程登陆服务器管理物理主机和虚拟主机任何时间都可登陆提高虚拟机效率 为任何平台开发和测试 1)借助一台单一本地…

lua调用C++函数

第一步搭建lua的环境. win10 lua环境搭建-CSDN博客 我使用的环境是win10vs2015lua54 先来个最简单的lua调用C函数, 无参数无返回值的 第一步:定义C函数. int CTest(lua_State* L) // 返回值是固定的int类型,返回0表示没有返回参数,返回1表示有一个返回参数 {std::cout &l…

【学习心得】响应数据加密的原理与逆向思路

一、什么是响应数据加密? 响应数据加密是常见的反爬手段的一种,它是指服务器返回的不是明文数据,而是加密后的数据。这种密文数据可以被JS解密进而渲染在浏览器中让人们看到。 它的原理和过程图如下: 二、响应数据加密的逆向思路 …

安装OneNote for Win10 | Win10/Win11

前言 PC端的OneNote分为2个版本,分别是Microsoft Store版本和Office版本,Microsoft Store版本即为OneNote for Win10,此版的OneNote有最近笔记功能,但检索功能不如Office版本,个人认为2个版本各有优劣。 但OneNote f…

Flink:Temporal Table Function(时态表函数)和 Temporal Join

博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,…

Skipped breakpoint at because it happened inside debugger evaluation亲测可用

问题描述: 在多线程项目中,在idea中打断点时,有时会遇到下面这种情况: idea左下角出现一行红底或者绿底文字提示: Skipped breakpoint at because it happened inside debugger evaluation 然后我们能感受到的就是…

Linux工具篇

文章目录 1.yum1.1 yum是什么?1.2yum下载的软件包在哪?1.3 yum的配置1.4 yum的相关操作 2. Vim2.1 各种模式的相关操作2.2 利用vim解决普通用户无法sudo的问题2.3 vim的配置 3.gcc/g3.1 利用gcc理解程序的翻译过程3.2 编译器的自举 4. 程序的链接4.1动态…

Sqli-labs靶场第16关详解[Sqli-labs-less-16]自动化注入-SQLmap工具注入

Sqli-labs-Less-16 #自动化注入-SQLmap工具注入 SQLmap用户手册:文档介绍 - sqlmap 用户手册 以非交互式模式运行 --batch 当你需要以批处理模式运行 sqlmap,避免任何用户干预 sqlmap 的运行,可以强制使用 --batch 这个开关。这样&#xff0…

Mybatis plus拓展功能-JSON处理器

目录 1 前言 2 使用方法 2.1 定义json实体类 2.2 在实体类中使用 1 前言 这是我最近学到的比较新奇的一个东西,数据库居然还可以存储JSON格式的数据,如下。虽然我感觉一般也没谁会这样干,但是既然有,那就当个科普讲一下Mybat…

深入了解 Android 中的 FrameLayout 布局

FrameLayout 是 Android 中常用的布局之一&#xff0c;它允许子视图堆叠在一起&#xff0c;可以在不同位置放置子视图。在这篇博客中&#xff0c;我们将详细介绍 FrameLayout 的属性及其作用。 <FrameLayout xmlns:android"http://schemas.android.com/apk/res/androi…

通过多进程并发方式(fork)实现服务器(注意要回收子进程)

以下内容为视频学习记录。 1、父进程accept后返回的文件描述符为cfd以及用于创建连接的lfd; 调用fork()创建子进程后&#xff0c;子进程继承cfd,lfd&#xff0c;通过该cfd与连接过来的客户端通信,lfd对子进程来说没用&#xff0c;可以直接close(lfd); 对于父进程来说&#x…

Leetcode刷题(十九)

一、55. 跳跃游戏 代码&#xff1a; class Solution:def canJump(self, nums: List[int]) -> bool:cur 0for i, num in enumerate(nums):if i < cur:cur max(cur, i num)if cur > len(nums) - 1:return Trueelse:breakreturn False