stm32f103c8t6
简介
AIN1(AO1) 0 AIN2(AO2) 1 反转
AIN1(AO1) 1 AIN2(AO2) 0 正转
由图可见我AIN1和AO2接了,所以原理正好相反
配置cubemx
配置为GPIO_OUT
代码
新建motor.c
#include "motor.h"
#include "main.h"
extern TIM_HandleTypeDef htim1;
//取绝对值
int abs(int p)
{
if(p>0)
return p;
else
return -p;
}
//电机的转动包括速度和方向
//方向
//输入左/右电机和方向
void motor_dir(int motor,int dir)
{
if(motor==left)
{
//正转
if(dir==forward)
{
//AIN1 0 AIN2 1
HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_RESET);//0
HAL_GPIO_WritePin(AIN2_GPIO_Port,AIN2_Pin,GPIO_PIN_SET);//1
}
//反转
else
{
//AIN1 1 AIN2 0
HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_SET);//1
HAL_GPIO_WritePin(AIN2_GPIO_Port,AIN2_Pin,GPIO_PIN_RESET);//0
}
}
//右电机没接线,就注释了
/*
else
{
//正转
if(dir==forward)
{
//AIN1 1 AIN2 0
HAL_GPIO_WritePin(BIN1_GPIO_Port,BIN1_Pin,GPIO_PIN_SET);//1
HAL_GPIO_WritePin(BIN2_GPIO_Port,BIN2_Pin,GPIO_PIN_RESET);//0
}
//反转
else
{
//AIN1 0 AIN2 1
HAL_GPIO_WritePin(BIN1_GPIO_Port,BIN1_Pin,GPIO_PIN_SET);//0
HAL_GPIO_WritePin(BIN2_GPIO_Port,BIN2_Pin,GPIO_PIN_RESET);//1
}
}
*/
}
//速度
//输入左/右电机和速度
void motor_speed(int motor,int pwm)
{
if(motor==left)
{
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_4,pwm);
}
/*
else
{
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_4,abs(pwm));
}
*/
}
//输入电机,方向,速度
void run(int motor ,int dir ,int pwm)
{
motor_dir(motor,dir);
motor_speed(motor,pwm);
}
motor.h
#ifndef __MOTOR_H__
#define __MOTOR_H__
#include "stm32f1xx_hal.h"
typedef enum{
left=0,
right=1
}motor;
typedef enum{
forward=0,
backward=1
}dir;
void motor_dir(int motor,int dir);
void motor_speed(int motor,int pwm);
void run(int motor ,int dir ,int pwm);
#endif
main.c
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_4);
run(left ,forward,100);
while (1)
{}
结果
因为crr最大为100% *(arr+1)=1*99+1=100,所以输入的速度最好在这个范围之内
注意
有个至今未解决的问题,stm32和其他部件的灯正常亮,但是电机就是没反应,而且我有两次尝试的时候,一次芯片特别特别烫,根本不是正常的温度,还有一次板子直接冒烟烧了,怀疑是以下原因:
1.下载器的问题
换了一个下载器,然并卵
2.不能边开着12V的外接电压,边下载程序
感觉极有可能是这个,最好下载程序的时候把其他部分,除了下载器之外的输入全都关了
3.外接的12V电压会突变??
因为第一次测tb6612模块引脚的电压的时候,发现应该是12V以内的地方,电压为16.8V,应该是5V的地方为8V,但是就只有一次,不排除是没接稳,
因为最近有很多结课作业和考试,暂时没法投入到这个问题中,只能换个板子走一步看一步