无人船的电机驱动:
1、由于无人船的电机功率比较大,无法使用驱动模块通过PWM来驱动。所以考虑使用继电器来驱动电机。使用继电器的缺点就是不能调速。
2、下面问题来了,无人船电源电压是12V,然而单片机一般都是5V来驱动,所以我将考虑使用一个降压模块,将12V降到5V左右,给STM32单片机供电。
3、单片机是如何与继电器进行结合工作呢是我们考虑的一个问题。我们要弄明白继电器的工作原理。继电器(英文名称:relay)是一种电控制器件,当输入量的变化达到规定要求时,在电气输出电路中使被控量发生预定的阶跃变化的一种电器。它具有控制系统(又称输入回路)和被控制系统(又称输出回路)之间的互动关系。通常应用于自动化的控制电路中,它实际上是用小电流去控制大电流运作的一种“自动开关”。
附上继电器的接线图:123为一路继电器,456为1路继电器
附上代码:选用PB1、PB2、PE11、PE12分别对应继电器的CH1、CH2、CH3、CH4引脚
relay.c
#include "stm32f10x.h"
#include "relay.h"
void RELAY_Init(void) //初始化函数
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOF, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_1);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_2);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_Init(GPIOF, &GPIO_InitStructure);
GPIO_SetBits(GPIOF,GPIO_Pin_11);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_Init(GPIOF, &GPIO_InitStructure);
GPIO_SetBits(GPIOF,GPIO_Pin_12);
}
//控制螺旋桨转向
void go_relay_on(void)
{
GPIO_SetBits(GPIOB,GPIO_Pin_1); //无人船前进
GPIO_SetBits(GPIOF,GPIO_Pin_11);
}
void back_relay_on(void)
{
GPIO_SetBits(GPIOB,GPIO_Pin_2); //无人船倒退
GPIO_SetBits(GPIOF,GPIO_Pin_12);
}
void go_left(void) //无人船左转
{
GPIO_SetBits(GPIOB,GPIO_Pin_2);
GPIO_ResetBits(GPIOB,GPIO_Pin_1);
}
void go_right(void) //无人船右转
{
GPIO_SetBits(GPIOB,GPIO_Pin_1);
GPIO_ResetBits(GPIOB,GPIO_Pin_2);
}
void go_relay_stop(void)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_1);
GPIO_ResetBits(GPIOF,GPIO_Pin_11); //无人船前进停止
}
void back_relay_stop(void)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_2);
GPIO_ResetBits(GPIOF,GPIO_Pin_12); //无人船后退停止
}