基于STM32F103的PWM电机驱动A4950

这篇具有很好参考价值的文章主要介绍了基于STM32F103的PWM电机驱动A4950。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.基本介绍

基于STM32F103的PWM电机驱动A4950

A4950的峰值输出电流可达±3.5 A,工作电压为7.6~40v。

优点:相对于L298N模块控制2个电机正反转仅需要4个I/O口,体积小,发热低。

缺点:需要2个PWM引脚才能控制正反转,所以控制2个电机需要4PWM引脚,会使用STM32F103芯片一个定时器的全部PWM通道。

A4950模块是靠输入2路的PWM占空比的差值,来设定输出电压的大小,当差值为0时输出为0,反之当占空比差值为100时输出最大。

2.引脚功能和接线

基于STM32F103的PWM电机驱动A4950

引脚名称 输入\输出 接线 功能
AOUT1     输出         接A电机正 输出电压控制电机
AOUT2     输出         接A电机负 输出电压控制电机
BOUT1     输出         接B电机正 输出电压控制电机
BOUT2     输出         接B电机负 输出电压控制电机
AIN1     输入           接STM32 A7 控制电机输出电压
AIN2     输入           接STM32 B1 控制电机输出电压
BIN1     输入           接STM32 A6 控制电机输出电压
BIN2     输入           接STM32 B0 控制电机输出电压
VM     输入           接12V电源 总电源

VCC

    输入           接5V电源 给内部逻辑电路供电
GND     输出          接电源地 接地

3程序设计

接下来我使用STM32F103C8T6的标准库代码为例

定时器3初始化代码

#include "stm32f10x.h"                  // Device header

void PWM_Init3(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

	GPIO_InitTypeDef GPIO_InitStructure1;
	GPIO_InitStructure1.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure1.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
	GPIO_InitStructure1.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure1);

	GPIO_InitTypeDef GPIO_InitStructure2;
	GPIO_InitStructure2.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure2.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
	GPIO_InitStructure2.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure2);

	TIM_InternalClockConfig(TIM3);
	
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	
	TIM_TimeBaseInitStructure.TIM_Period  = 100-1;  //ARR
	TIM_TimeBaseInitStructure.TIM_Prescaler  = 3600-1; //PSC
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
	
	TIM_OCInitTypeDef 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;//CCR
	
    TIM_OC1Init(TIM3,&TIM_OCInitStructure);
	TIM_OC2Init(TIM3,&TIM_OCInitStructure);
	TIM_OC4Init(TIM3,&TIM_OCInitStructure);
    TIM_OC3Init(TIM3,&TIM_OCInitStructure);
    
    TIM_ClearFlag(TIM3, TIM_FLAG_Update);
	
    TIM_Cmd(TIM3,ENABLE);
 }

 
 
void PWM_SetCompare1(uint16_t Compare)
 {
	 TIM_SetCompare1 (TIM3,Compare);
 }
  
void PWM_SetCompare2(uint16_t Compare)
 {
	 TIM_SetCompare2 (TIM3,Compare);
 }
 
void PWM_SetCompare3(uint16_t Compare)
 {
	 TIM_SetCompare3 (TIM3,Compare);
 }

void PWM_SetCompare4(uint16_t Compare)
 {
	 TIM_SetCompare4 (TIM3,Compare);
 }

电机控制函数

#include "stm32f10x.h"                  // Device header
#include "PWM.h"
void Motor_Init(void)
{
	PWM_Init3();
}
// you
void Motor_SetSpeed2(int16_t Speed)
{
	
		PWM_SetCompare3(50-Speed/2);
		PWM_SetCompare1(50+Speed/2);

	
}
//zuo
void Motor_SetSpeed1(int16_t Speed)
{
	
		PWM_SetCompare2(50-Speed/2);
		PWM_SetCompare4(50+Speed/2);

}

 mian函数代码

#include "stm32f10x.h"                  // Device header
#include "Motor.h"
int main (void)
{
	Motor_Init(); //电机驱动初始化
	while(1)
	{
		
		Motor_SetSpeed1(20);//给电机1 向前20速度
		Motor_SetSpeed2(20);//给电机2 向前20速度
		
	}

}

全部源码链接:主控/C8T6/A4950 · 亟待/electronic-game-code - 码云 - 开源中国 (gitee.com)https://gitee.com/AD123zsg/electronic-game-code/tree/master/%E4%B8%BB%E6%8E%A7/C8T6/A4950文章来源地址https://www.toymoban.com/news/detail-440629.html

到了这里,关于基于STM32F103的PWM电机驱动A4950的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于STM32F103C8T6的端口重映射及定时器输出PWM控制

    #一、端口重映射原理及部分/完全重映射 #二、端口重映射的配置 #三、PWM控制 ##1、通用定时器输出PWM ##2、PWM的工作原理 ##3、PWM的内部运作机制 ##4、PWM的模式 ##5、自动加载的预载寄存器 #四、定时器输出PWM结构体及库函数的配置 #五、项目硬件 #六、项目代码 一、端口重映射

    2024年02月13日
    浏览(23)
  • 基于STM32F103ZET6使用STM32CubeMX配置FSMC模块驱动LCD屏(基于正点原子历程)

    在学习STM32的过程中,刚好学到了LCD屏,我使用的是STM32F103ZET6,屏幕是正点原子的。但是在我自己新建工程点亮显示LCD屏时遇到了很多问题。解决之后分享在此,希望能帮助到遇到此困惑的朋友。 想要快速驱动LCD屏请直接跳转到CubeMX配置 FSMC全名叫可变静态存储控制器(Fle

    2024年02月15日
    浏览(22)
  • ESP8266 模块简易驱动程序 -- 基于 STM32F103 及原子云固件实现云功能

    本简易驱动程序是基于 正点原子 的ESP8266模块,主要用于实现连接 原子云 的功能。MCU选用的是 STM32F103ZET6 注:原子云固件添加了 AT+ATKCLDSTA 和 AT+ATKCLDCLS 两条指令 用于连接正点原子自家的原子云平台,原厂的AT指令不受任何影响 本程序主要实现了如下功能: 设定工作模式 连

    2023年04月23日
    浏览(20)
  • Proteus仿真stm32f103r6输出PWM/正弦波

    Proteus仿真stm32f103r6输出PWM/正弦波  

    2024年01月23日
    浏览(21)
  • STM32F103C6T6之PWM+DMA篇

    最近在学习PWM+DMA配合生成可改变占空比的PWM波形。找了很多很多资料但是感觉对初学者不是很友善,只是提供了很多原理。这边使用的代码是固件库版的,也是学习STM32最基础的固件库代码了吧! 预分频器(TIMx_PSC) 自动重装载寄存器(TIMx_ARR) 捕获/比较寄存器x(TIMx_CCRx) 当P

    2023年04月18日
    浏览(19)
  • 基于STM32F103C8T6使用Arduino IDE编程闭环控制4个带编码器的有刷直流电机

    题记:标题有点长了,纯粹为了方便被检索到~~~本贴主要用于支持南方科技大学SDIM学院工业设计专业大三综合项目移动底盘学习,也是我自己按照费曼学习方法的一次尝试,用从底层搭建一个机器人底盘来复习自动控制原理。         由于工业设计专业没有开设嵌入式课程

    2024年02月05日
    浏览(19)
  • STM32F103驱动oled显示屏

    oled显示屏和其他显示屏类似,不过他只有0.96英寸,屏幕较小,但是使用起来比较方便。有二种驱动方式,分别为IIC,和SPI驱动。驱动方式比较简单。IIC驱动的话只需要4根线,电源,地线,数据线,和时钟线。 我这里使用的是IIC协议驱动oled显示屏,如果想了解IIC协议的可以看

    2024年02月11日
    浏览(24)
  • 野火STM32F103驱动GT911触摸芯片

    芯片介绍 GT911 是专为 7”~8”设计的新一代 5 点电容触控 方案,拥有 26 个驱动通道和 14 个感 应通道,以满足更高的 touch 精度要求。 GT911 可同时识别 5 个触摸点位的 实时准确位置 , 移动轨迹 及 触摸面积。 并可根据主控需要,读取相应点数的触摸信息。 芯片原理图 管脚定

    2024年02月06日
    浏览(28)
  • STM32F103ZET6 驱动 OLED

    目录 前言 OLED模块的基本了解 OLED驱动程序的开发 前言 ​ 大家好,这是我第一次发帖,由于,我的技术并不成熟,程序难免有编写不规范的地方,希望读者能够指正,也希望这篇帖子能够让读者对OLED模块有个大致的了解。很高兴能与大家交流。 OLED模块的基本了解 OLED模块的

    2024年02月14日
    浏览(14)
  • STM32F103硬件SPI驱动ADS1256

    最近实验室有几个项目都需要用到高分辨率AD转换,于是就开始了ADS1256的开发。 新手,焊得丑,见谅(能用就行) 二: 本以为很容易就能做完,结果被采样速率的问题困扰了很久。 代码如下,使用2.5V基准源进行测试,结果在读ADS时经常出现读出0xFFFFFF的情况,只能忍住悲伤

    2024年02月12日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包