一,A4950电机驱动模块
1,看A4950芯片手册
2,看模块原理图
我没有,谁有可以给我
3,接线图
水平有限:不知道怎么讲
二,软件驱动电机
1,STM32CubeMX配置
VBAT_IN:12V电源正极 AIN1与BIN1:控制正反转 AIN2与BIN2:PWM控制速度
VCC:5V电源正极 BO1,BO2和AO1,AO2:电机的电源线 编码器其他的线还用不到
配置后可以实现转动 通过2个函数:
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_4, 10);
HAL_GPIO_WritePin(BIN1_GPIO_Port,BIN1_Pin,GPIO_PIN_SET);
2,电机运动模块
#include "motor.h"
#include "tim.h"
//正值向前走
void Motor_Set(int Motor1,int Motor2)
{
Motor1 = -Motor1;
Motor2 = -Motor2;
//1.先根据正负设置方向GPIO 高低电平
if(Motor1 <0) BIN1_SET;
else BIN1_RESET;
if(Motor2 <0) AIN1_SET;
else AIN1_RESET;
//2.然后设置占空比
if(Motor1 <0)
{
if(Motor1 <-99) Motor1 =-99;
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, (100+Motor1));
}
else
{
if(Motor1 >99) Motor1 = 99;
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1,Motor1);
}
if(Motor2<0)
{
if(Motor2 <-99) Motor2=-99;
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_4, (100+Motor2));
}
else
{
if(Motor2 >99) Motor2 =99;
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_4, Motor2);
}
}
#ifndef MOTOR_H__
#define MOTOR_H__
#include "main.h"
#define AIN1_SET HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_SET)
#define AIN1_RESET HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_RESET)
#define BIN1_SET HAL_GPIO_WritePin(BIN1_GPIO_Port,BIN1_Pin,GPIO_PIN_SET)
#define BIN1_RESET HAL_GPIO_WritePin(BIN1_GPIO_Port,BIN1_Pin,GPIO_PIN_RESET)
void Motor_Set(int Motor1,int Motor2);
#endif
三,编码器电机
①,编码器测速原理
1,普遍编码器原理
Encoder Interface 编码器接口
编码器接口可接收增量(正交)编码器的信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的位置、旋转方向和旋转速度
每个高级定时器和通用定时器都拥有1个编码器接口
两个输入引脚借用了输入捕获的通道1和通道2
具体的计数方式略
2,具体编码器测速
具体哪一个引脚可以配置看:STM32中文参考手册-第119页 的 TIMx的复用功能重映像
可以得出转速公式(每10ms执行一次)
MotorSpeed = (float)EncodeCount*100/9.6/11/4;
单位(圈/秒) EncodeCount是编码器的计数
3,具体编码器测速的STM32CubeMX配置
具体步骤 略
设置TIMx为编码器模式,设置最大值为655535 ,用两路TIM1和TIM2计数(就是4倍的)
滤波器为6,打开中断,端口输入设置为上拉
②,实现中断定时测量速度
将以下函数放入中断回调函数中(将这些函数设定为没10ms执行一次)
Encode2Count = (short)__HAL_TIM_GET_COUNTER(&htim2); //记录计数器的值
__HAL_TIM_SET_COUNTER(&htim4,0); //清空计数器CNT的值
Motor1Speed = (float)Encode1Count*100/9.6/11/4; //计算出速度
其他略