STM32f103入门(7)pwm驱动led驱动舵机驱动直流电机

PWM驱动

  • PWM介绍
    • TIM_OC1Init 配置通道
    • TIM_OCStructInit 输出比较参数默认值
    • 输出比较模式 TIM_OCInitstructure
    • 输出比较极性 TIM_OCInitstructure
    • 设置输出使能
    • 以下三个决定了PWM的频率 占空比
    • 初始化通道 TIM_OC1Init(TIM2, &TIM_OCInitstructure);
    • GPIO复用 PWM通道
  • 驱动LED
    • 复用推挽输出
  • 驱动舵机
  • 驱动直流电机

PWM介绍

每个定时器有四个通道,每一个通道都有一个捕获比较寄存器,
将寄存器值和计数器值比较,通过比较结果输出高低电平,实现PWM信号在这里插入图片描述

如图为向上计数:定时器重装载值为ARR,比较值CCRxt时刻对计数器值和比较值进行比较如果计数器值小于CCRx值,输出低电平如果计数器值大于CCRx值,输出高电平PWM的一个周期定时器从0开始向上计数当0-t1段,定时器计数器TIMx_CNT值小于CCRx值,输出低电平t1-t2段,定时器计数器TIMx_CNT值大于CCRx值,输出高电平当TIMx_CNT值达到ARR时,定时器溢出,重新向上计数...循环此过程至此一个PWM周期完成影响因素ARR : 决定PWM周期(在时钟频率一定的情况下,当前为默认内部时钟CK_INT)CCRx : 决定PWM占空比(高低电平所占整个周期比例)

TIM_OC1Init 配置通道

配置比较函数 一个函数配置一个单元
参数1 定时器 参数2 输出比较参数 ******

void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

TIM_OCStructInit 输出比较参数默认值

输出比较参数默认值

void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct);

用来配置强制输出模式 = 100%占空比

void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);

用来配置CCR寄存器预装功能

void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);

用来单独修改CCR寄存器值的函数(更改占空比)****

void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);
void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);
void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3);
void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4);

再补充说明一下这个函数仅高级定时器使用在使用高级定时器输出PWM时需要调用这个函数使能主输出否则PWM将不能正常输出

void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState);

输出比较模式 TIM_OCInitstructure

TIM_OCInitstructure.TIM_OCMode = TIM_OCMode_PWM1;
1 冻结模式
2 相等时置有效电平
3 相等时置无效电平
4 相等时电平反转
5 6 pwm1 pwm2
在这里插入图片描述

输出比较极性 TIM_OCInitstructure

TIM_OCInitstructure.TIM_OCPolarity = ;

在这里插入图片描述
1高极性 极性不反转 REF波形直接输出 REF有效时 输出高电平
2 REF有效时 输出低电平

设置输出使能

TIM_OCInitstructure.TIM_OutputNState = TIM_OutputNState_Enable;

以下三个决定了PWM的频率 占空比

TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1; //ARR in时基
TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1; //PSC in 时基
TIM_OCInitstructure.TIM_Pulse = ; //CCR 0000~FFFF
在这里插入图片描述

初始化通道 TIM_OC1Init(TIM2, &TIM_OCInitstructure);

GPIO复用 PWM通道

在这里插入图片描述

驱动LED

复用推挽输出

在这里插入图片描述在这里插入图片描述
我们可以看到 pa0的控制权 由输出数据寄存器 跳转到了片上外设
所以 PA0的输出模式改为复用输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

分辨率1% 频率1k 占空比 50% 由公式可得
ARR = 100 - 1
CCR = 50
PSC = 720 - 1
后期可以调 CCR 来控制占空比
0 - 100 分别代表占空比 0 - 100 %

#include "stm32f10x.h"                  // Device headervoid PWM_Init(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //打开时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//	GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);
//	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 控制权来自于定时器GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;		//GPIO_Pin_15;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);TIM_InternalClockConfig(TIM2);  //选择内部时钟TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; //初始化时基单元TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;		//ARRTIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1;		//PSCTIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);TIM_OCInitTypeDef TIM_OCInitStructure;//配置输出比较单元TIM_OCStructInit(&TIM_OCInitStructure);TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse = 50;		//CCRTIM_OC1Init(TIM2, &TIM_OCInitStructure);TIM_Cmd(TIM2, ENABLE);//启动定时器
}void pwm_setcompare1(uint16_t Compare)  //实时修改CRR 用来控制PWM占空比
{TIM_SetCompare1(TIM2, Compare);
}

驱动舵机

驱动舵机不免驱动一个,多数情况下会驱动多个
那么一个定时器应该如何驱动多个舵机呢
我们可以开通多个通道
在这里插入图片描述在这里插入图片描述

占空比要求一般 0.5ms - 2.5 ms

ARR+1 = 20k
PSC + 1 = 72
CRR = 500 -2500

这里通道设置为2 GPIOA pin2
初始化代码基本不变
main如下

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "sevo.h"uint16_t i;
float angle=0;
int main(void)
{OLED_Init();//Apin 14 15sevo_init();//TIM2 ͨµÀ2 PA1while (1){if(angle>180) angle=0;sevoangle(angle);OLED_ShowNum(1,1,angle,3);//angle+=30;Delay_ms(1000);}
}

sevo.c如下

#include "stm32f10x.h"                  // Device header#include "pwm.h"void sevo_init(void){PWM_Init();
}
void sevoangle(float angle){angle=angle/180 * 2000 + 500;TIM_SetCompare2(TIM2, angle);
}

实现了1s钟 舵机旋转30度

舵机接口   
1. 5V电压 
2. PWM通道2  这里接PA1 TIM2 通道 2
3. GND

驱动直流电机

在这里插入图片描述

频率越快 蜂鸣器杂音越小 20kHZ psc=32 预分频器= 32
72M / 32 = 20KHZ
CCR = -100 ~ +100 反转 和 正转

由于设备不齐全 只能理论以下了

VM 5v
VCC 3.3v
GND
AO1 正极
AO2 负极
PWMA 接A2 使用的TIM2 通道3
AIN2 GPIO A5
AIN1 GPIO A4
正传 A4=1 A5=0
反转 相反
STBY 3.3vCCR用来控制速度0-100但我们输入参数的时候是-100 ~ +100  这是因为我们要区分正传还是反转如果为负数 我们就A4=0 A5=1 反之 相反如果为负值 我们需要取绝对值 否则CCR会错误

留个作业

旋转编码器来控制舵机 留在这

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

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

相关文章

学习 使用pandas库 DataFrame 使用

1 、 数据排序 sort_values()函数 by:要排序的名称或名称列表, sorted_df df.sort_values(byAge,ascendingFalse) 由大到小排序; sorted_df df.sort_values(byAge) 由小到大排序; # 创建一个示例数据帧 data {Name: [Tom, Nick, John…

【C++从0到王者】第二十五站:多继承的虚表

文章目录 前言一、多继承的虚函数表二、菱形继承与菱形虚拟继承的虚函数表1.菱形继承2.菱形虚拟继承的虚函数表 三、抽象类1.抽象类的概念2.接口继承与实现继承 总结 前言 其实关于单继承的虚函数表我们在上一篇文章中已经说过了,就是派生类中的虚表相当于拷贝了一…

面向对象的设计原则

设计模式 Python 设计模式:对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。每一个设计模式系统地命名、解释和评价了面向对象系统中一个重要的和重复出现的设计 面向对象 三大特性:封装、继承、多态 …

xsschallenge靶场练习1-13关

文章目录 第一关第二关第三关第四关第五关第六关第七关第八关第九关第十关第十一关第十二关第十三关 第一关 观察页面 http://192.168.80.139/xsschallenge/level1.php?nametest尝试在name后面输入最近基本的xss语法 <script>alert(1)</script>第二关 查看页面源…

java.lang.classnotfoundexception: com.android.tools.lint.client.api.vendor

Unity Android studio打包报错修复 解决方式 java.lang.classnotfoundexception: com.android.tools.lint.client.api.vendor 解决方式 在 launcherTemplate 目录下找到 Android/lintOptions 选项 加上 checkReleaseBuilds false lintOptions { abortOnError false checkRelea…

阿里云效和阿里在线idea使用

阿里云效 https://flow.aliyun.com/all?page1 阿里在线idea&#xff1a;https://ide.aliyun.com/ 在云效中创建的项目可以在在线idea 打开 运行中的项目 设置ssh 设置以后可以使用云效率的代码构建来构建代码 设置 添加自有云或者体验5h

C++/C:pass-by-value(值传递)与pass-by-reference(引用传递)

一、C的引用&#xff08;reference&#xff09; 1.1、引用的概念 c中新增了引用&#xff08;reference&#xff09;的概念&#xff0c;引用可以作为一个已定义变量的别名。 Declares a named variable as a reference, that is, an alias to an already-existing object or f…

Android 1.1 背景相关与系统架构分析

目录 1.1 背景相关与系统架构分析 分类 Android 基础入门教程 1.Android背景与当前的状况 2.Android系统特性与平台架构 系统特性&#xff1a; 平台架构图&#xff1a; 架构的简单理解&#xff1a; 3.本节小结&#xff1a; 1.1 背景相关与系统架构分析 分类 Android 基础…

【python使用 Pillow 库】缩小|放大图片

当我们处理图像时&#xff0c;有时候需要调整图像的大小以适应特定的需求。本文将介绍如何使用 Python 的 PIL 库&#xff08;Pillow&#xff09;来调整图像的大小&#xff0c;并保存调整后的图像。 环境准备 在开始之前&#xff0c;我们需要安装 Pillow 库。可以使用以下命令…

数据结构(Java实现)-二叉树(下)

获取二叉树的高度 检测值为value的元素是否存在(前序遍历) 层序遍历 判断一棵树是不是完全二叉树 获取节点的路径 二叉树的最近公共祖先

FrameWork的概述与启动过程

FrameWork框架 Framework定义了客户端组件和服务端组件功能及接口。以下阐述中&#xff0c;“应用程序”一般是指“.apk”程序。 框架中包含三个主要部分&#xff0c;分别为服务端、客户端和Linux驱动。 服务端 服务端主要包含两个重要类&#xff0c;分别是WindowManagerSe…

Kubernetes(K8s)基本环境部署

此处只做学习使用&#xff0c;配置单master环境。 一、环境准备 1、ip主机规划&#xff08;准备五台新机&#xff09;>修改各个节点的主机名 注意&#xff1a;关闭防火墙与selinux 节点主机名ip身份joshua1 kubernetes-master.openlab.cn 192.168.134.151masterjoshua2k…

javacv 基础04-读取mp4,avi等视频文件并截图保存图片到本地

javacv 读取mp4,avi等视频文件并截图保存图片到本地 代码如下&#xff1a; package com.example.javacvstudy;import org.bytedeco.javacv.FFmpegFrameGrabber; import org.bytedeco.javacv.Frame; import org.bytedeco.javacv.Java2DFrameConverter;import javax.imageio.Im…

2023年高教社杯数学建模思路 - 案例:最短时间生产计划安排

文章目录 0 赛题思路1 模型描述2 实例2.1 问题描述2.2 数学模型2.2.1 模型流程2.2.2 符号约定2.2.3 求解模型 2.3 相关代码2.4 模型求解结果 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 最短时…

Debezium的三种部署方式

Debezium如何部署 debezium 有下面三种部署方式,其中最常用的就是 kafka connect。 kafka connect 一般情况下,我们通过 kafka connect 来部署 debezium,kafka connect 是一个框架和运行时: source connectors:像 debezium 这样将记录发送到 kafka 的source connectors…

Omni Recover for Mac(专业的iPhone数据恢复软件)

Omni Recover for Mac是一款专业的Mac数据恢复软件&#xff0c;能够帮助用户快速找回被误删除、格式化、病毒攻击等原因造成的文件和数据&#xff0c;包括图片、视频、音频、文档、邮件、应用程序等。同时&#xff0c;Omni Recover for Mac还具有数据备份和清理功能&#xff0c…

【大数据】图解 Hadoop 生态系统及其组件

图解 Hadoop 生态系统及其组件 1.HDFS2.MapReduce3.YARN4.Hive5.Pig6.Mahout7.HBase8.Zookeeper9.Sqoop10.Flume11.Oozie12.Ambari13.Spark 在了解 Hadoop 生态系统及其组件之前&#xff0c;我们首先了解一下 Hadoop 的三大组件&#xff0c;即 HDFS、MapReduce、YARN&#xff0…

Linux

文章目录 一、引言1.1 开发环境1.2 生产环境1.3 测试环境1.4 操作系统的选择 二、Linux介绍2.1 Linux介绍2.2 Linux的版本2.3 Linux和Windows区别 三、Linux安装3.1 安装VMware3.2 安装Xterm3.3 在VMware中安装Linux3.3.1 选择安装方式3.3.2 指定镜像方式3.3.3 选择操作系统类型…

API接口接入电商平台案例,数据采集获取商品历史价格信息示例

商品历史价格接口是开放平台提供的一种API接口&#xff0c;通过调用API接口&#xff0c;开发者可以获取天猫商品的标题、价格、库存、月销量、总销量、库存、详情描述、图片、最低价、当前价格、价格信息等详细信息 。 获取商品历史价格接口API是一种用于获取电商平台上商品历…

基于jeecg-boot的flowable流程审批时增加下一个审批人设置

更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbacheng/nbcio-boot 前端代码&#xff1a;https://gitee.com/nbacheng/nbcio-vue.git 在线演示&#xff08;包括H5&#xff09; &#xff1a; http://122.227.135.243:9888 因为有时…