stm32 麦克纳姆轮小车遥控(已修改)
本程序用于进行麦克纳姆轮小车遥控,已完成修改,能正常控制侧向移动。车内有RGB灯,用的是之前发布的程序。
项目文件已发布到GitHub,链接:Willian7004/Programs-for-STM32F103RCT6 (github.com)
代码如下,具体说明见注释
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "smg.h"
#include "remote.h"
#include "timer.h"
#include "beep.h"
//共阴数字数组
// 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F, 全灭
u8 smg_num[] = {0xfc, 0x60, 0xda, 0xf2, 0x66, 0xb6, 0xbe, 0xe0, 0xfe, 0xf6, 0xee, 0x3e, 0x9c, 0x7a, 0x9e, 0x8e, 0x01, 0x00};
u8 key = 0; //按键值
u8 num = 0x00; //数值
u8 num1 = 0x00; //数值
u8 smg_wei = 6; //数码管位选
u8 smg_duan = 0; //数码管段选
u8 smg_flag = 0; //数码管显示标志 0:正常显示 1:消除鬼影
u8 t = 0;
int a=0;
int b=0;
int c=0;
int d=0;
int e=0;
int f=0;
int g=0;
int h=0;
//接线:PA0到3分别接第一块L298N的IN1到IN4,PA4到PA7分别接第二块L298N的IN4到IN1,第一块L298N的IN1和IN3控制电机正转,第二块相反
void wheel() //电机正反转控制(正转向前,反转向后)
{ //1:正转 2:反转 0:停止
if(a==1) //a:左前轮 b:右前轮 c:左后轮 d:右后轮
{HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);}
if(a==0)
{HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);}
if(a==2)
{HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);}
if(b==1)
{HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);}
if(b==0)
{HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);}
if(b==2)
{HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);}
if(c==1)
{HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);}
if(c==0)
{HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);}
if(c==2)
{HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);}
if(d==1)
{HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);}
if(d==0)
{HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);}
if(d==2)
{HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET);}
}
int main(void)
{
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(RCC_PLL_MUL9); //设置时钟,72M
delay_init(72); //初始化延时函数
uart_init(115200); //设置串口115200
LED_Init(); //初始化LED
BEEP_Init(); //初始化蜂鸣器
LED_SMG_Init(); //初始化数码管
TIM4_Init(19, 7199); //数码管2ms定时显示
Remote_Init(); //红外接收初始化
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
while (1)
{
}
}
//定时器4中断服务函数调用
void TIM4_IRQHandler(void)
{
if (__HAL_TIM_GET_IT_SOURCE(&TIM4_Handler, TIM_IT_UPDATE) != RESET)
{
__HAL_TIM_CLEAR_IT(&TIM4_Handler, TIM_IT_UPDATE);
key = Remote_Scan();
//数字键为正式操作方案,行进方向为与数字键5的相对方向,0和退格控制旋转
if (key)
{
switch (key)
{
case 104:
num = smg_num[1];
a=1;
b=0;
c=0;
d=1;
wheel();
break; //按键'1'
case 152:
num = smg_num[2];
a=1;
b=1;
c=1;
d=1;
wheel();
break; //按键'2'
case 176:
num = smg_num[3];
a=0;
b=1;
c=1;
d=0;
wheel();
break; //按键'3'
case 48:
num = smg_num[4];
a=1;
b=2;
c=2;
d=1;
wheel();
break; //按键'4'
case 24:
num = smg_num[17];
a=0;
b=0;
c=0;
d=0;
wheel();
break; //按键'5'
case 122:
num = smg_num[5];
a=2;
b=1;
c=1;
d=2;
wheel();
break; //按键'6'
case 16:
num = smg_num[6];
a=0;
b=2;
c=2;
d=0;
wheel();
break; //按键'7'
case 56:
num = smg_num[7];
a=2;
b=2;
c=2;
d=2;
wheel();
break; //按键'8'
case 90:
num = smg_num[8];
a=2;
b=0;
c=0;
d=2;
wheel();
break; //按键'9'
case 66:
num = smg_num[9];
a=2;
b=1;
c=2;
d=1;
wheel();
break; //按键'0'
case 82:
num = smg_num[0];
a=1;
b=2;
c=1;
d=2;
wheel();
break; //按键'DELETE'
case 162:
a=1;
wheel();
break;//按键'POWER'
case 98:
a=2;
wheel();
break;//按键'UP'
case 226:
b=1;
wheel();
break;//按键'ALIENTEK'
case 34:
b=2;
wheel();
break;//按键'LEFT'
case 2:
num = smg_num[17];
a=0;
b=0;
c=0;
d=0;
wheel();
break;//按键'PLAY'
case 194:
c=1;
wheel();
break;//按键'RIGHT'
case 224:
c=2;
wheel();
break;//按键'VOL-'
case 168:
d=1;
wheel();
break;//按键'DOWN'
case 144:
d=2;
wheel();
break;//按键'VOL+'
}
}
if (smg_wei == 6) //数码管位
{
smg_duan = num1;
}
else if (smg_wei == 7)
{
smg_duan = num;
}
if (smg_flag) LED_Write_Data(0x00, smg_wei); //消除鬼影(段码不显示)
else LED_Write_Data(smg_duan, smg_wei); //正常显示
LED_Refresh();//数码管数据更新
smg_flag = !smg_flag;
if (smg_flag == 0) //正常显示才更新位码
{
smg_wei++;
if (smg_wei == 8) smg_wei = 6;
}
t++;
if (t == 250)
{
t = 0;
}
}
}