本项目采用STM32单片机和L298电机驱动模块,简单连线制作;后期会加入避障和循迹功能;
1.硬件选型
2.源程序
主函数
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "remote.h"
#include "motorcon.h"
#include "exti.h"
#include "beep.h"
/************************************************
开发板:STM32F10x+L298N直流电机驱动器
项目名称:基于STM32红外遥控智能小车设计
功能:1.红外遥控小车前进、后退,左转弯、右转弯
2.小车前进后退0-10档加减速、指定档位变速
端口定义:IN1--GPIOC_pin0
IN2--GPIOC_pin1
IN3--GPIOC_pin2
IN4--GPIOC_pin3
ENA--GPIOF_pin0
ENB--GPIOF_pin1
STM32电源---VCC 3.3V
电源配置:直流电机驱动L298电源--VCC 6.0V
特别注意:STM32单片机和L298N共地连接
日期:2020年6月4日,第一次
************************************************/
int main(void)
{
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
LED_Init(); //LED端口初始化
LCD_Init();
KEY_Init();
Remote_Init(); //红外接收初始化
Motor_IOconfig(); //电机端口初始化
BEEP_Init(); //初始化蜂鸣器IO
EXTIX_Init(); //初始化外部中断输入
POINT_COLOR=RED; //设置字体为红色
LCD_ShowString(30,50,200,16,16,"STM32+L289N");
LCD_ShowString(30,70,200,16,16,"REMOTE INTELLIGENCE CAR");
LCD_ShowString(30,90,200,16,16,"PARAMETER DISPLAY");
LCD_ShowString(30,110,200,16,16,"2020/6/4");
LCD_ShowString(30,130,200,16,16,"KEYVALA:");
LCD_ShowString(30,150,200,16,16,"KEYCONT:");
LCD_ShowString(30,170,200,16,16,"SYMBOLY:");
LCD_ShowString(30,190,200,16,16,"SPEED LEVEL:");
while(1)
{
if(flagforward==1)
{motor_Sforward();}
if(flagback==1)
{motor_Sback();}
// if(flagleft==1)
// {motor_left();}
// if(flagright==1)
// {motor_right();}
// if(flagstop==1)
// {motor_stop();}
}
}
头文件exti.h
#ifndef __EXTI_H
#define __EXIT_H
#include "sys.h"
void EXTIX_Init(void);//外部中断初始化
extern u8 flagforward,flagback;//flagleft,flagright,flagstop;
extern u8 num,di_num,gao_num;
#endif
源程序exti.c
#include "exti.h"
#include "led.h"
#include "key.h"
#include "delay.h"
#include "usart.h"
#include "beep.h"
#include "remote.h"
#include "lcd.h"
#include "motorcon.h"
//外部中断0服务程序,0-15位IO中断
void EXTIX_Init(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用功能时钟
//GPIOB.9 中断线以及中断初始化配置 下降沿触发 //REMOTE IN
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource9);//GPIO与中断线的映射关系
EXTI_InitStructure.EXTI_Line=EXTI_Line9; //中断线9,取值范围为0-15
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发中断
EXTI_Init(&EXTI_InitStructure);
//NVIC中断优先级设置
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //使能红外接收二极管所对应的外部中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; //抢占优先级2,
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //子优先级0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&NVIC_InitStructure);
}
u8 key;
u8 flagforward=0,flagback=0;//flagleft=0,flagright=0,flagstop=0;
u8 num=0,di_num=10,gao_num=0;
//外部中断9服务程序 ,中断线5-9
void EXTI9_5_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line9)!=RESET) //判断某个中断线是否有中断产生
{
u8 *str=0; //***定义字符换指针str**//
key=Remote_Scan(); //接收红外发送数值
if(key)
{
LCD_ShowNum(86,130,key,3,16); //显示键值
LCD_ShowNum(86,150,RmtCnt,3,16); //显示按键次数
switch(key)
{
case 0:str="ERROR";break;
case 162:str="POWER"; //停车
// flagstop=1;
motor_stop();
break;
case 98:str="UP";
flagforward=1,flagback=0; //前进
break;
case 2:str="PLAY";break;
case 226:str="ALIENTEK";break;
case 194:str="RIGHT"; //右转
// flagright=1,flagleft=0;
motor_right();
break;
case 34:str="LEFT"; //左转
// flagleft=1,flagright=0;
motor_left();
break;
case 224:str="VOL-"; //减速
if(num!=0)
num--;
else
num=0;
motor_reddisp();
break;
case 168:str="DOWN"; //后退
flagback=1,flagforward=0;
break;
case 144:str="VOL+"; //加速
num++;
if(num==10)
num=10;
motor_reddisp();
break;
case 104:str="1";num=0;gao_num=0;di_num=10;break; //指定档位
case 152:str="2";num=1;gao_num=1;di_num=9;break;
case 176:str="3";num=2;gao_num=2;di_num=8;break;
case 48:str="4";num=3;gao_num=3;di_num=7;break;
case 24:str="5";num=4;gao_num=4;di_num=6;break;
case 122:str="6";num=5;gao_num=5;di_num=5;break;
case 16:str="7";num=6;gao_num=6;di_num=4;break;
case 56:str="8";num=7;gao_num=7;di_num=3;break;
case 90:str="9";num=8;gao_num=8;di_num=2;break;
case 66:str="0";num=9;gao_num=9;di_num=1;break;
case 82:str="DELETE";num=10;gao_num=10;di_num=0;break;
}
LCD_Fill(86,170,116+8*8,170+16,WHITE); //清楚之前的显示
LCD_ShowString(86,170,200,16,16,str); //显示SYMBOLY
LCD_ShowNum(86,190,num,3,16); //显示按键次数
}
BEEP=!BEEP;
EXTI_ClearITPendingBit(EXTI_Line9); //清除LINE0上的中断标志位
}
}
源文件motorcon.h
#ifndef _MOTORCON_H
#define _MOTORCON_H
#include "sys.h"
#define uint unsigned int
#define uchar unsigned char
#define IN1 PCout(0)
#define IN2 PCout(1)
#define IN3 PCout(2)
#define IN4 PCout(3)
#define ENA PFout(0)
#define ENB PFout(1)
void Motor_IOconfig(void);
void motor_Sforward(void);
void motor_Sback(void);
void motor_left(void);
void motor_right(void);
void motor_stop(void);
void motor_redkchange(void);
void motor_reddisp(void);
#endif
源程序motorcon.c
#include "motorcon.h"
extern u8 num,di_num,gao_num;
void Motor_IOconfig()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOF,ENABLE); //使能GPIOC和GPIOF端口时钟
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3; //GPIOC端口配置
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_ResetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);
//GPIO_C的0,1,2,3端口初始化为低电平,即IN1-IN4端口
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0|GPIO_Pin_1;//设置引脚模式为推免输出模式,,IO口速度为50MHz
GPIO_Init(GPIOF,&GPIO_InitStructure);
GPIO_ResetBits(GPIOF,GPIO_Pin_0|GPIO_Pin_1); //GPIO_F的0,1端口初始化为低电平,即ENA端口
}
/*电机前进函数*/
void motor_Sforward()
{
uchar i;
IN1=1;
IN2=0;
for(i=0;i<di_num;i++)
{
ENA=0; //PWM低电平输出
}
for(i=0;i<gao_num;i++)
{
ENA=1; //PWM高电平输出
}
}
/*电机后退函数*/
void motor_Sback()
{
uchar i;
IN1=0;
IN2=1;
for(i=0;i<di_num;i++)
{
ENA=0;
}
for(i=0;i<gao_num;i++)
{
ENA=1;
}
}
/*左转弯函数*/
void motor_left()
{
ENB=1;
IN3=0;
IN4=1;
}
/*右转弯函数*/
void motor_right()
{
ENB=1;
IN3=1;
IN4=0;
}
/*电机停止函数*/
void motor_stop()
{
ENA=0;
ENB=0;
}
/*红外数据处理函数*/
void motor_reddisp()
{
switch(num)
{
case 0:
gao_num=0; //高电平持续时间为1,低电平为3
di_num=10;
break;
case 1:
gao_num=1; //高电平持续时间为8,低电平持续时间为2
di_num=9;
break;
case 2:
gao_num=2; //高电平持续时间为7,低电平持续时间为3
di_num=8;
break;
case 3:
gao_num=3; //高电平持续时间为6,低电平持续时间为4
di_num=7;
break;
case 4:
gao_num=4; //高电平持续时间为5,低电平持续时间为5
di_num=6;
break;
case 5:
gao_num=5; //高电平持续时间为4,低电平持续时间为0
di_num=5;
break;
case 6:
gao_num=6; //高电平持续时间为6,低电平持续时间为4
di_num=4;
break;
case 7:
gao_num=7; //高电平持续时间为7,低电平持续时间为3
di_num=3;
break;
case 8:
gao_num=8; //高电平持续时间为8,低电平持续时间为2
di_num=2;
break;
case 9:
gao_num=9; //高电平持续时间为9,低电平持续时间为1
di_num=1;
break;
case 10:
gao_num=10; //高电平持续时间为10,低电平持续时间为0
di_num=0;
break;
}
}
【必读】版权免责声明
1、本主题所有言论和内容纯属会员个人意见,与本论坛立场无关。2、本站对所发内容真实性、客观性、可用性不做任何保证也不负任何责任,网友之间仅出于学习目的进行交流。3、对提供的数字内容不拥有任何权利,其版权归原著者拥有。请勿将该数字内容进行商业交易、转载等行为,该内容只为学习所提供,使用后发生的一切问题与本站无关。 4、本网站不保证本站提供的下载资源的准确性、安全性和完整性;同时本网站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。 5、本网站所有软件和资料均为网友推荐收集整理而来,仅供学习用途使用,请务必下载后两小时内删除,禁止商用。6、如有侵犯你版权的,请及时联系我们(电子邮箱1370723259@qq.com)指出,本站将立即改正。
|
|