STM32--TIM定时器(2)
文章目录
- 输出比较
- PWM
- 输出比较通道
- 参数计算
- 舵机简介
- 直流电机简介
- TB6612
- PWM基本结构
- PWM驱动呼吸灯
- PWM驱动舵机
- PWM控制电机
输出比较
输出比较,简称OC(Output Compare)。
输出比较的原理是,当定时器计数值与比较值相等或者满足某种特定条件时,比较通道会产生一个输出信号,这个输出信号可以用来触发外部事件,如控制其他外设的操作,或者驱动外部电路。
在每个高级定时器和通用定时器都拥有4个输出比较通道。
高级定时器的前3个通道额外拥有死区生成和互补输出的功能。
PWM
我们可以利用输出比较来对外产生一个PWM频率。
PWM(Pulse Width Modulation)脉冲宽度调制,是一种常用的控制信号技术。通过改变信号的脉冲宽度来控制电力开关装置的平均功率。在PWM中,周期保持不变,而脉冲的宽度可以根据需要进行调整。
PWM技术广泛应用于电力电子领域,特别是在电机控制和电源调节方面。通过调整PWM信号的占空比(脉冲宽度与周期之比),可以精确地控制输出信号的平均电压或电流。这种控制方式可以实现对电机速度、亮度、电压等参数的精确控制,具有高效率、高精度和低成本的优点。
频率=1/Ts;占空比=Ton/Ts;分辨率=占空比的变化步距。
我们可以利用输出比较,对输出电平进行一定程度的控制,就能输出PWM频率。
输出比较通道
通用定时器总框图。
放大效果:
在比较通道左边,CNT计数器与捕获/比较寄存器中的值进行比较大小,再根据控制器,就会输出一定的电平。
ETRF是定时器的小功能,一般不用到。
REF(rreference)实际上就是指这里信号的高低电平。REF可以映射到主模式的TRGO输出上去;REF的主要去向是去到输出使能电路,它会先走向一个寄存器,如果寄存器输出为0,那么电平将不翻转,保持原样;如果信号为1,REF会通向一个非门取反,也就是高低电平翻转的信号;接着通过使能电路,将有一个寄存器(CC1E)控制;最后到OC1引脚,接到CH1通道上。
输出模式控制器,可以根据自己需求来选择模式:
参数计算
红色线表示CCR,也就是比较值;黄色线表示自动装载寄存器中的值(ARR);蓝色线表示计数值CNT;
当CNT<CCR时,输出高电平;当CNT>=CCR时,输出低电平。
这里对应的是PWM模式1的向上计数。
PWM频率: Freq = CK_PSC / (PSC + 1) / (ARR + 1)
PWM占空比: Duty = CCR / (ARR + 1)
PWM分辨率: Reso = 1 / (ARR + 1)
舵机简介
舵机(Servo)是一种常用的电动执行器,通常用于控制机械运动和定位定位。它由一个直流电机、减速装置、位置反馈装置和控制电路组成。
舵机的工作原理是控制电路根据输入信号生成特定的PWM信号,并驱动直流电机和减速装置运转,使输出轴转动到所需的位置。位置反馈装置(常用的是旋转式电位器)会实时监测输出轴的位置,并将信息反馈给控制电路,以便进行修正和精确控制。
SG90使用要求:输入PWM信号要求:周期为20ms,高电平宽度为0.5ms~2.5ms
硬件电路:
直流电机简介
直流电机是一种将电能转换为机械能的装置,有两个电极,当电极正接时,电机正转,当电极反接时,电机反转。
直流电机属于大功率器件,GPIO口无法直接驱动,需要配合电机驱动电路来操作。
TB6612
TB6612是一款双路H桥型的直流电机驱动芯片,常用于控制直流电机的转动方向和速度。它具有高效率、低功耗和高输出等特点,适用于各种电机驱动应用。
TB6612芯片内部集成了H桥驱动电路,可通过控制引脚实现正转、反转、制动和浮动等操作。它可以工作于3.3V或5V逻辑电平,支持PWM输入控制电机速度,并提供过流保护功能,防止电机过载。
硬件电路:
PWM基本结构
通过配置时基单元,,让计时器驱动与CCR比较,在PWM模式1下输出电平最后通向GPIO口。
PWM驱动呼吸灯
接线模式:
PWM.h
#ifndef __PWM_H__
#define __PWM_H__void PWM_Init();
void PWM_SetCompare(uint16_t Compare);#endif
PWM.c
#include "stm32f10x.h" // Device headervoid PWM_Init()
{//开启APB1外设开关RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //复用推挽输出GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);//配置内部时钟TIM2TIM_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; //自动加载寄存器周期值TIM_TimeBaseInitStructure.TIM_Prescaler=1-1; //预分频值TIM_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=0; //指定要捕获的脉冲值CCRTIM_OC1Init(TIM2,&TIM_OCInitStructure);//启用TIM2外设控制TIM_Cmd(TIM2,ENABLE);}
//设置CCR比较值
void PWM_SetCompare(uint16_t Compare)
{TIM_SetCompare1(TIM2,Compare);
}
对于GPIO口来说,不止是接通了外设,还需要将PWM频率传输给外设,所以使用了复用推挽输出。
输出比较结构体有多个成员,我们这里一些成员不用到,所以先进行结构体初始化,再进行对一些成员的赋值。
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "PWM.h"uint16_t i;int main()
{OLED_Init();PWM_Init();while(1){for(i=0;i<=100;i++){PWM_SetCompare(i);Delay_ms(10);}for(i=0;i<=100;i++){PWM_SetCompare(100-i);Delay_ms(10);}}
}
PWM驱动舵机
OLED函数所取地址
连接方式:
SYTM32驱动电压只有3.3V,舵机需要5V的驱动电压;
Servo.c
#include "stm32f10x.h" // Device header
#include "PWM.h"void Servo_Init()
{PWM_Init();
}void Servo_SetAngle(float Angle)
{PWM_SetCompare(Angle/180*200+50);
}
Servo.h
#ifndef __SERVO_H__
#define __SERVO_H__void Servo_Init();
void Servo_SetAngle(float Angle);#endif
这里的PWM频率是有要求的,所以需要将PWM.c的CNT和ARR进行修改:频率=72M/720/2000=50Hz。
这里的转动度数需要根据占空比来进行计算:
Key.c
#include "stm32f10x.h" // Device header
#include "Delay.h"void Key_Init(void)
{//设置APB2外设时钟开关RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//对结构体成员的选择GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//结构体初始化GPIO_Init(GPIOB, &GPIO_InitStructure);
}//获取键码
uint8_t Key_GetNum(void)
{uint8_t KeyNum = 0;if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0){Delay_ms(20);while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0);Delay_ms(20);KeyNum = 1;}if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0){Delay_ms(20);while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0);Delay_ms(20);KeyNum = 2;}return KeyNum;
}
Key.h
#ifndef __KEY_H_
#define __KEY_H_void Key_Init(void);
uint8_t Key_GetNum(void);#endif
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "Servo.h"
#include "Key.h"
uint16_t angle;
int main()
{OLED_Init();Servo_Init();Key_Init();OLED_ShowString(1,1,"Angle:");while(1){if(Key_GetNum()==1){angle+=30;if(angle>180){angle=0;}}Servo_SetAngle(angle);OLED_ShowNum(1,7,angle,3);}}
PWM控制电机
接线方式:
Motor.h
#ifndef __MOTOR_H__
#define __MOTOR_H__void Motor_init();
void Motor_GetSpeed(int8_t Speed);#endif
Motor.c
#include "stm32f10x.h" // Device header
#include "PWM.h"void Motor_init()
{//设置APB2外设时钟开关RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//对结构体成员的选择GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//结构体初始化GPIO_Init(GPIOA, &GPIO_InitStructure);PWM_Init();
}
//速度输入函数
void Motor_GetSpeed(int8_t Speed)
{if(Speed>=0){GPIO_SetBits(GPIOA,GPIO_Pin_5);GPIO_ResetBits(GPIOA,GPIO_Pin_4);PWM_SetCompare(Speed);}else{GPIO_SetBits(GPIOA,GPIO_Pin_4);GPIO_ResetBits(GPIOA,GPIO_Pin_5);PWM_SetCompare(-Speed);}
}
PWM的占空比作为速度的调节,两个接口的正反接作为方向的控制。
对于电机驱动电路所接引脚,需要进行GPIO口的初始化;
当输入速度为负时,将接口上引脚进行电平翻转,读者可以进行尝试,怎么接为正,怎么接为负;对于小于0的速度,需要加上符号变成正数。
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "Motor.h"
#include "Key.h"
int8_t Speed;
int main()
{OLED_Init();Motor_init();Key_Init();OLED_ShowString(1,1,"Speed:");while(1){if(Key_GetNum()==1){Speed+=20;if(Speed>100){Speed=-100;}}Motor_GetSpeed(Speed);OLED_ShowSignedNum(1,7,Speed,3);}
}
相关文章:

STM32--TIM定时器(2)
文章目录 输出比较PWM输出比较通道参数计算舵机简介直流电机简介TB6612 PWM基本结构PWM驱动呼吸灯PWM驱动舵机PWM控制电机 输出比较 输出比较,简称OC(Output Compare)。 输出比较的原理是,当定时器计数值与比较值相等或者满足某种…...

git Authentication failed
情况是这样的,之前看代码只是clone了一份,但随着分支越来越多,有时候切换分支时必须先把修改的代码 stash 一下,觉得很麻烦,于是又clone了一份代码。然后pull代码是正常的,当push 代码的时候,去…...

【软考】2023系统架构设计师考试
目录 1 软考资格设置 2 考试报名 3 考试准备 4 参加考试 5 考试感受 6 其他 1 软考资格设置 2 考试报名 报名网址:https://www.ruankao.org.cn/ 3 考试准备 4 参加考试 2023年下半年系统架构设计师考试时间为11月4、5日。 5 考试感受 6 其他 最近好像有地区…...

opencv基础55-获取轮廓的特征值及示例
轮廓自身的一些属性特征及轮廓所包围对象的特征对于描述图像具有重要意义。本节介绍几个轮廓自身的属性特征及轮廓所包围对象的特征。 宽高比 可以使用宽高比(AspectRation)来描述轮廓,例如矩形轮廓的宽高比为: 宽高比 宽度&am…...

OpenCV图像处理——形态学操作
目录 连通性形态学操作腐蚀和膨胀开闭运算礼帽和黑帽 连通性 形态学操作 形态学转换是基于图像形状的一些简单操作。它通常在二进制图像上执行。腐蚀和膨胀时两个基本的形态学运算符。然后它的变体形式如开运算,闭运算,礼帽黑帽等 腐蚀和膨胀 cv.erode…...

修改VS Code终端的显示行数
文章目录 前言修改VS Code终端显示行数参考 前言 在我们使用VS Code运行代码的过程中,有时需要再终端中显示很多的运行过程信息或者结果。然而,VS Code的终端默认显示1000行的内容,随着显示内容的增多,之前的内容就丢失了。为了解…...

C++学习| MFC简单入门
前言:因为接手了CMFC的程序,所以需要对MFC编程方面有所了解。 C之MFC简单入门 MFC相关的概念MFCWIN32QT MFC项目基本操作MFC项目创建MFC项目文件解读界面和代码数据交互——加法器 MFC相关的概念 MFC MFC(Microsoft Foundation Classes微软…...

“一日之际在于晨”,欢迎莅临WAVE SUMMIT上午场:Arm 虚拟硬件早餐交流会
8月16日,盛夏的北京将迎来第九届WAVE SUMMIT深度学习开发者大会。在峰会主论坛正式开启前,让我们先用一份精美的元气早餐,和一场“Arm虚拟硬件交流会”,唤醒各位开发小伙伴的开发魂! 8月16日,WAVE SUMMIT大…...
leetcode454. 四数相加 II
题目:leetcode454. 四数相加 II 描述: 给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 < i, j, k, l < n nums1[i] nums2[j] nums3[k] num…...

PHP证券交易员学习网站mysql数据库web结构apache计算机软件工程网页wamp
一、源码特点 PHP证券交易员学习网站 是一套完善的web设计系统,对理解php编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 下载地址https://download.csdn.net/download/qq_41221322/88205549 PHP证券交易员…...

对p-n结/AlGaN/GaN HEMTs中n-GaN掺杂浓度对栅极可靠性的影响
目录 第35届功率半导体器件与集成电路国际研讨会论文集2023年5月28日至6月1日,中国香港南方科技大学电气电子工程系,深圳标题:Impacts of n-GaN Doping Concentration on Gate Reliability of p-n Junction/AlGaN/GaN HEMTs摘要信息解释研究了…...

Mac M2 Pro安装使用Cocoapods
Mac Pro M2安装使用Cocoapods 在新公司要做iOS开发,所以在新电脑上安装Cocoapods 在升级gem,sudo gem update --system,和安装cocoapods时都遇到如下的提示: ERROR: While executing gem ... (Errno::EPERM)Operation not per…...

枚举缓存工具
此文章为笔记,为阅读其他文章的感受、补充、记录、练习、汇总,非原创,感谢每个知识分享者。 文章目录 1. 背景2. 枚举缓存3. 样例展示4. 性能对比5. 总结 本文通过几种样例展示如何高效优雅的使用java枚举消除冗余代码。 1. 背景 枚举在系统…...
【BASH】回顾与知识点梳理(二十五)
【BASH】回顾与知识点梳理 二十五 二十五. 特殊shell、PAM 模块、讯息传递和大量建置账号25.1 特殊shell特殊的 shell, /sbin/nologin 25.2 PAM模块25.3 Linux 主机上的用户讯息传递查询使用者: w, who, last, lastlog使用者对谈: write, mesg, wall使用…...

什么是Node js?什么是React?有什么区别
JavaScript是当今最流行的编程语言之一,它用于开发多种技术,两种这样的技术是Node.js和React。许多学生很难理解Nodejs和React之间的区别。 React和Nodejs之间的主要区别在于它们的使用位置。Nodejs 用于开发应用程序的服务器端,而Reactjs用于…...

使用postman做接口测试
1.接口测试:针对软件对外提供服务的接口的输入输出进行测试,以及接口间相互逻辑的测试,验证接口功能与接口描述文档的一致性 2.接口测试流程: 1)获取接口信息:通过接口文档或抓包来获取接口的基本调用方式和…...

VMware Workstation 如何启用复制粘贴
产品:VMware Workstation 16 Pro 版本:16.1.1 build-17801498 我们刚安装好的 VMware Workstation 会发现无法复制粘贴文件到虚拟机中,如下为解决方案: 1.点击 虚拟机,点击 安装 VMware Tools(T)...。 2.虚拟机下面会…...

免费小程序商城搭建之b2b2c o2o 多商家入驻商城 直播带货商城 电子商务b2b2c o2o 多商家入驻商城 直播带货商城 电子商务 bbc
1. 涉及平台 平台管理、商家端(PC端、手机端)、买家平台(H5/公众号、小程序、APP端(IOS/Android)、微服务平台(业务服务) 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端…...

VSCode-Python传参数进行Debug
新建demo.py import argparse def parse_args():description "debug example" parser argparse.ArgumentParser(descriptiondescription) help "The path of address"parser.add_argument(--host,help help) parser.add_ar…...

实践-传统深度学习
简介与安装 2 训练自己的数据集整体流程3 数据加载与预处理4 搭建网络模型5 学习率对结果的影响6 Drop-out操作7 权重初始化方法对比8 初始化标准差对结果的影响9 正则化对结果的影响10 加载模型进行测试 TensorFlow:每一步都需要自己做。 Keras:做起来更…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...

Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...

基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...

DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...

接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...

PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...