1、PAN1020是蓝牙SOC
2、1508S是控制电机正反转的专用芯片
二者结合可以通过蓝牙驱动电机,进一步说就是可以用手机驱动小车
一、板子
所用板子见:PAN1020 SWD方式程序下载(烧写)_修充电器上瘾的博客-CSDN博客
这是一个儿童车的驱动板,主控是PAN1020,通过1508s驱动四个电机。电机驱动部分连线图:
1508s的管脚图:
1508s 输入输出逻辑表
所以只要控制2个输入线的高低电平就可以控制输出的四种状态:待命、前进、后退、刹车。
二、源码
源代码源自pan1020SDK-->proj_rgb_light工程
增加了以下函数
/**
* @prief 初始化电机
*/
void motor_init()
{
//motor1 INA:P2.4 INB:P2.3
GPIO_SetMode(P2,BIT4,GPIO_MODE_OUTPUT);
GPIO_SetMode(P2,BIT3,GPIO_MODE_OUTPUT);
P24=0;
P23=0;
//motor2 INC:P2.2 IND:P5.7
GPIO_SetMode(P2,BIT2,GPIO_MODE_OUTPUT);
GPIO_SetMode(P5,BIT7,GPIO_MODE_OUTPUT);
P22=0;
P57=0;
//motor3 INA:P0.6 INB:P0.7
GPIO_SetMode(P0,BIT6,GPIO_MODE_OUTPUT);
GPIO_SetMode(P0,BIT7,GPIO_MODE_OUTPUT);
P06=0;
P07=0;
//motor4 INC:P2.6 IND:P2.5
GPIO_SetMode(P2,BIT6,GPIO_MODE_OUTPUT);
GPIO_SetMode(P2,BIT5,GPIO_MODE_OUTPUT);
P26=0;
P25=0;
}
motor_init()初始化了驱动电机的GPIO,初始状态,电机待命。
/**
* @prief 设置电机运动 1508S 输出电流:1.8A
* @param iMotor:哪一个电机;mType:运动类型:0:待命;1;前进;2;后退;3:刹车
*/
void motor_set_motion(uint8_t iMotor,uint8_t mType)
{
switch(iMotor)
{
case 1:
switch(mType)
{
case 0: //待命
P24=0;
P23=0;
break;
case 1: //前进
P24=1;
P23=0;
break;
case 2: //后退
P24=0;
P23=1;
break;
case 3: //刹车
P24=1;
P23=1;
break;
}
break;
case 2:
switch(mType)
{
case 0: //待命
P22=0;
P57=0;
break;
case 1: //前进
P22=1;
P57=0;
break;
case 2: //后退
P22=0;
P57=1;
break;
case 3: //刹车
P22=1;
P57=1;
break;
}
break;
case 3:
switch(mType)
{
case 0: //待命
P06=0;
P07=0;
break;
case 1: //前进
P06=1;
P07=0;
break;
case 2: //后退
P06=0;
P07=1;
break;
case 3: //刹车
P06=1;
P07=1;
break;
}
break;
case 4:
switch(mType)
{
case 0: //待命
P26=0;
P25=0;
break;
case 1: //前进
P26=1;
P25=0;
break;
case 2: //后退
P26=0;
P25=1;
break;
case 3: //刹车
P26=1;
P25=1;
break;
}
break;
}
}
motor_set_motion(uint8_t iMotor,uint8_t mType)控制4个电机的四种状态。代码毫无技巧可言。
static int rgb_server1_peer_write_data_ind_handler(ke_msg_id_t const msgid,
struct rgb_server1_peer_write_data_ind const *param,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
{
static uint8_t zf=0;
uint8_t data[2]={0x16,0xbb};
const uint8_t arr1[10] = {0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00};
const uint8_t arr2[10] = {0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x00,0x00};
if(memcmp(param->packet,arr1,10) == 0 || memcmp(param->packet,arr2,10) == 0)
{
}
else
{
show_reg3(param->packet,param->packet_size);
}
//Set RGB
if((param->packet_size==5)&&(param->packet[0]==0xAA)&&(param->packet[1]==0x16))
{
light_set_rgb(param->packet[2]*10,param->packet[3]*10,param->packet[4]*10);
}
else if((param->packet_size==2)&&(param->packet[0]==0xAA)&&(param->packet[1]==0x03))
{
printf("close light\r\n");
light_set_rgb(0,0,0);
motor_set_motion(1,3);
if(zf==0){
motor_set_motion(1,2);
zf=1;
}
else{
motor_set_motion(1,1);
zf=0;
}
}
app_rgb1_send_value(RGB_SERVERICE1_IDX_10,data,2);
return (KE_MSG_CONSUMED);
}
修改了pan1020SDK-->proj_rgb_light工程-->app_rgb_light1.c-->rgb_server1_peer_write_data_ind_handler函数
增加了
motor_set_motion(1,3); //电机1刹车
if(zf==0){
motor_set_motion(1,2); //电机1反转
zf=1;
}
else{
motor_set_motion(1,1); //电机1正转
zf=0;
}
三、使用
在手机上连上蓝牙,发出"AA03"指令可以电机改变旋转方向。
四、总结
1、1508s输出5v1.8A,为了安全,接下载器的时候不接电机,接电机的时候不接下载器。