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.hqwc.cn/news/94025.html

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

相关文章

代码随想录笔记--哈希表篇

目录 1--有效的字母异位词 2--两个数组的交集 3--两数之和 4--四数相加II 5--三数之和 6--四数之和 1--有效的字母异位词 利用哈希表存储每个字母的出现次数&#xff0c;比较两个字符串各个字母出现次数是否相等即可&#xff1b; #include <iostream> #include <…

Ansible学习笔记8

group模块&#xff1a; 创建一个group组&#xff1a; [rootlocalhost ~]# ansible group1 -m group -a "nameaaa gid5000" 192.168.17.105 | CHANGED > {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}…

JavaScript页面怎么跳转

在JavaScript中&#xff0c;可以使用window.location对象来实现页面跳转。window.location对象包含了当前页面的URL信息&#xff0c;可以通过修改它的属性来实现页面跳转。 以下是一些常见的页面跳转方式&#xff1a; 使用window.location.href属性来跳转到一个新的URL&#…

综合实训-------成绩管理系统 V1.1

综合实训-------成绩管理系统 V1.1 1、一维数组数据double 2、我们用元素的位置来当学号。 1、录入数据 【5个数据】或【通过文件的方式取数据】 2、显示数据 3、添加一条记录 4、修改一条记录 5、删除一条记录 6、查找一条记录。【输入学号&#xff0c;显示成绩】 7、统计。【…

时序预测 | MATLAB实现EEMD-SSA-LSTM、EEMD-LSTM、SSA-LSTM、LSTM时间序列预测对比

时序预测 | MATLAB实现EEMD-SSA-LSTM、EEMD-LSTM、SSA-LSTM、LSTM时间序列预测对比 目录 时序预测 | MATLAB实现EEMD-SSA-LSTM、EEMD-LSTM、SSA-LSTM、LSTM时间序列预测对比预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 时序预测 | MATLAB实现EEMD-SSA-LSTM、E…

安全帽人脸联动闸机开关算法

安全帽人脸联动闸机开关算法通过yolov7python网络模型深度学校框架 &#xff0c;安全帽人脸联动闸机开关算法能够判断人员是否穿戴规定的工装是不是现场人员&#xff0c;当穿戴合规且为现场人员&#xff0c;闸机门禁才打开。YOLO的结构非常简单&#xff0c;就是单纯的卷积、池化…

Linux--VMware的安装和Centos

一、VMware和Linux的关系 二、VMware的安装 VM_ware桌面虚拟机 最新中文版 软件下载 (weizhen66.cn) VMware-Workstation-Lite-16.2.2-19200509-精简安装注册版.7z - 蓝奏云 如果安装不成功&#xff0c;则设置BIOS 三、在VMware中加入Centos 下载地址&#xff1a; CentOS-…

使用DOSBOX运行TurboC2,TC2使用graphics库绘图

Turbo C是由美国Borland公司开发的一套C语言程序开发工具&#xff0c;Borland公司是一家专门从事软件开发、研制的大公司。该公司相继推出了一套Turbo系列软件&#xff0c;如Turbo BASIC、Turbo Pascal、Turbo Prolog&#xff0c;这些软件很受用户欢迎 [1] 。 Turbo C集成了程序…

Mac 多版本jdk安装与切换

macOS上可以安装多个版本的jdk&#xff0c;方法如下&#xff1a; 1.下载jdk 在Oracle官网上下载不同版本的jdk&#xff1a; https://www.oracle.com/java/technologies/downloads/#java17 方案一 1.查看本机所有的jdk /usr/libexec/java_home -V3. 配置环境变量 打开bash_…

OceanBase安全审计之传输加密

上一期我们讲了关于 OceanBase 安全审计的《身份鉴别》和《用户管理与访问控制》 两个部分&#xff0c;OceanBase 的安全机制介绍其支持传输加密&#xff0c;今天我们主要来实践一下如何配置传输加密以及验证是否真的加密。 作者&#xff1a;金长龙 爱可生测试工程师&#xff0…

【计算机基础】Git从安装到使用,详细每一步!扩展Github\Gitlab

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

maven本地安装jar包install-file,解决没有pom的问题

背景&#xff1a; 公司因为权限问题&#xff0c;没有所有的代码&#xff0c;内部maven还在搭建&#xff0c;所以需要拿到同事的jar包&#xff0c;本地install&#xff1a; mvn install:install-file -DgroupIdcom..framework -DartifactIdcloud-api -Dversion1.0.0-SNAPSHOT …