1.电机如何转动
只须要给电机两个端子加一正一负的极性就会转起来了,但是要留意的是不要将电机两端直接接在5v和gnd之间,这种电机一样寻常要提供几百毫安的电流,而GPIO口只能提供几毫安,所以我们使用一个DRV8833来驱动
DRV8833输入口要接PA0,PA1,并且供电,通过OUT1,OUT2毗连电机
IN1,IN2对应PA0,PA1。
如果要使电机转速发生改变,我们可以将通入DRV8833的IN1,IN2接PWM即可。通过改变高电平时间实现转速的快慢
2.DRV8833
由于有两对输出口,则一个DRV8833可以驱动两个电机,对应SLEEP引脚是如果开启,则驱动芯片克制工作,实现低功耗,FAULT引脚是出现控制错误时提示单片机
3.DRV8833驱动代码
drv8833.h
- #ifndef __DRV8833_H_
- #define __DRV8833_H_
- #include <stdint.h>
- /**
- * @brief 衰减模式枚举
- */
- typedef enum {
- SLOW_DECAY, /**< 慢衰减模式 */
- FAST_DECAY /**< 快衰减模式 */
- } DecayMode;
- /**
- * @brief 初始化DRV8833
- */
- void DRV8833_Init(void);
- /**
- * @brief 设置衰减模式
- * @param mode 衰减模式
- */
- void DRV8833_SetDecayMode(DecayMode mode);
- /**
- * @brief 控制电机前进
- * @param speed 速度值(0-100)
- */
- void DRV8833_Forward(uint8_t speed);
- /**
- * @brief 控制电机后退
- * @param speed 速度值(0-100)
- */
- void DRV8833_Backward(uint8_t speed);
- /**
- * @brief 电机刹车
- */
- void DRV8833_Brake(void);
- /**
- * @brief 电机滑行
- */
- void DRV8833_Coast(void);
- #endif /* __DRV8833_H_ */
复制代码 drv8833.c
4.使用
使用旋转编码器控制电机转动,旋转编码器顺时针转实现电机正转,并且越转越快。
旋转编码器逆时针转实现电机反转并且越转越快
PA0,PA1刚好是定时器2的1通道和2通道
使用屏幕配置i2c
5.代码
- #include "drv8833.h"
- #include "oled.h"
- #include <stdio.h>
- #define MAX_COUNT 20
- int main(void)
- {
- MX_GPIO_Init();
- MX_I2C1_Init();
- MX_TIM1_Init();
- MX_TIM2_Init();
- /* USER CODE BEGIN 2 */
- OLED_Init();
- HAL_TIM_Encoder_Start(&htim1,TIM_CHANNEL_ALL);//打开编码器计数
- DRV8833_Init();//打开PWM通道
- int count;
- char message[50]="";
- int speed;//电机的占空比0~100
- __HAL_TIM_SET_COUNTER(&htim1,MAX_COUNT);//先设置为20,让电机不转
-
- while (1)
- {
- count=__HAL_TIM_GET_COUNTER(&htim1);//获取编码器计数
- if(count>60000)//逆时针转 //保证编码器计数在0~40
- {
- count=0;
- __HAL_TIM_SET_COUNTER(&htim1,0);
- }
- else if(count>MAX_COUNT*2)
- {
- count=MAX_COUNT*2;
- __HAL_TIM_SET_COUNTER(&htim1,MAX_COUNT*2);
- }
- if(count<MAX_COUNT)//反转,count越接近0,越快
- {
- speed=(MAX_COUNT-count)*100/MAX_COUNT;//speed在0~100,先×100,如果0~20数/20会为0
- DRV8833_Forward(speed);
- }
- else//正转,count越接近40,越快,count为20,speed为0,不转
- {
- speed=(count-MAX_COUNT)*100/MAX_COUNT;
- DRV8833_Backward(speed);
- }
- OLED_NewFrame();
- sprintf(message,"count:%d",count);//显示编码器计数
- OLED_PrintString(10,0,message,&font16x16, OLED_COLOR_NORMAL);
- sprintf(message,"speed:%d",speed);//显示速度
- OLED_PrintString(10,20,message,&font16x16, OLED_COLOR_NORMAL);
- if(count<20)
- OLED_PrintString(10,40,"反转",&font16x16, OLED_COLOR_NORMAL);
- else if(count>20)
- OLED_PrintString(10,40,"正转",&font16x16, OLED_COLOR_NORMAL);
- OLED_ShowFrame();
- HAL_Delay(10);
-
- }
- }
复制代码- DRV8833_Forward(speed);
- DRV8833_Forward(speed);//操作定时器2的1,2通道通过设置比较寄存器的值来改变占空比,控制转速
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |