完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
重要声明
看过我前面51小车博客的都知道我是软件工程专业的,对于硬件方面都是因为感兴趣自学的,这不,因为今年寒假放假比较早,趁这个时间学习了STM32相关知识,经过近一个月的学习对于STM32算是入门了,为了检验自己的学习效果,我决定就着51小车的架子用STM32试试,经过一个下午的忙活算是成功了!!!所以再来和大家分享一下。 所需知识贮备 相信看到这篇文章的小伙伴都是有相关基础的,这里只是给和我一样自学的小伙伴提个醒。动手之前你需要这些: 硬件电路连接相关能力 C语言基础能力 STM32定时器、中断、串口等基础知识 查阅相关元件开发手册的能力 一定的动手能力 准备材料 正点原子STM32精英开发板(STM32F103ZET6)、LM2596降压模块、HC-06蓝牙模块、MG995系列180度舵机、L298N电机驱动、任意品牌遥控车车架带电机、12V聚合物锂电池一块 部分原始材料图片 程序设计思路 STM32利用L298N电机驱动模块控制前后两路直流电机 motor.c #include “motor.h” //导入led头文件 #include “stm32f10x.h” //导入STM32官方库 #include “stm32f10x_rcc.h” //导入STM32的RCC时钟库 #include “delay.h” //延时库 void Motor_12_Config(void) //定义初始化函数 { GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO_InitTypeDef结构体 RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOF, ENABLE); //开启引脚时GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3; //定义IN引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //通用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置输出功率 GPIO_Init(GPIOF, &GPIO_InitStructure); //初始化GPIOF的引脚参数,写进 GPIO_ResetBits(GPIOF,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3); //所有引脚拉低 } void Motor_1_STOP(void) { IN1(High); IN2(High); } void Motor_1_PRun(void) { IN1(Low); IN2(High); } void Motor_1_NRun(void) { IN1(High); IN2(Low); } void Motor_2_STOP(void) { IN3(High); IN4(High); } void Motor_2_PRun(void) { IN3(Low); IN4(High); } void Motor_2_NRun(void) { IN3(High); IN4(Low); } motor.h #ifndef __MOTOR1_H #define __MOTOR1_H #include “stm32f10x.h” #include “stm32f10x_gpio.h” #define High 1 #define Low 0 #define IN1(a) if (a) GPIO_SetBits(GPIOF,GPIO_Pin_0); else GPIO_ResetBits(GPIOF,GPIO_Pin_0) #define IN2(a) if (a) GPIO_SetBits(GPIOF,GPIO_Pin_1); else GPIO_ResetBits(GPIOF,GPIO_Pin_1) #define IN3(a) if (a) GPIO_SetBits(GPIOF,GPIO_Pin_2); else GPIO_ResetBits(GPIOF,GPIO_Pin_2) #define IN4(a) if (a) GPIO_SetBits(GPIOF,GPIO_Pin_3); else GPIO_ResetBits(GPIOF,GPIO_Pin_3) void Motor_12_Config(void); void Motor_1_STOP(void); void Motor_1_PRun(void); void Motor_1_NRun(void); void Motor_2_STOP(void); void Motor_2_PRun(void); void Motor_2_NRun(void); #endif PWM波控制舵机角度用于转向 PWM.C #include “PWM.h” #include “stm32f10x.h” /* 函 数 名 : pwm_init 函数功能 : IO端口及TIM3初始化函数 */ void PWM_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量,用来初始化GPIO TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//声明一个结构体变量,用来初始化定时器 TIM_OCInitTypeDef TIM_OCInitStructure;//根据TIM_OCInitStruct中指定的参数初始化外设TIMx /* 开启时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); /* 配置GPIO的模式和IO口 */ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;// PC6 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出 GPIO_Init(GPIOC,&GPIO_InitStructure); //TIM3定时器初始化 TIM_TimeBaseInitStructure.TIM_Period = 199; //PWM 频率=72000/(199+1)=36Khz//设置自动重装载寄存器周期的值 TIM_TimeBaseInitStructure.TIM_Prescaler = 7199;//设置用来作为TIMx时钟频率预分频值 TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;//设置时钟分割:TDTS = Tck_tim TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM3, & TIM_TimeBaseInitStructure); GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);//改变指定管脚的映射 //pC6 TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//PWM输出使能 TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low; TIM_OC1Init(TIM3,&TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);//使能或者失能TIMx在CCR1上的预装载寄存器 TIM_Cmd(TIM3,ENABLE); } HC_06蓝牙模块用于通信(我用的是USART1串口) (这部分代码参照原子视频代码即可!) 因为文章只是分享一个大概,具体的控制外设CSDN上也有很多可以参考的文章,大家有需要可以自行搜索查看,有问题也可以私信我) 接线示意 这里只是示意图,比较简略,只为了展示元件之间的接线,具体的供电根据自己的情况,建议L298N、STM32和舵机全部单独供电,避免产生影响,需要注意的是共地的问题,有基础的应该不难理解!! 主程序代码 #include “stm32f10x.h” //官方库 #include “stm32f10x_gpio.h” #include “stm32f10x_rcc.h” #include “sys.h” #include “delay.h” #include “motor.h” #include “PWM.h” #include “led.h” #include “usart.h” #include “beep.h” int main() { u16 RxData; //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(115200); //串口初始化为115200 Motor_12_Config(); //电机的初使化 PWM_Init(); //舵机初始化 BEEP_Init(); //初始化蜂鸣器端口 delay_init(); //延时函数初始化 LED_Init(); //初始化LED端口 while(1) { if(USART_GetFlagStatus( USART1, USART_FLAG_RXNE)) { USART_ClearFlag(USART1, USART_FLAG_RXNE); RxData=USART_ReceiveData( USART1); } if(RxData == 0x01){ //前进 //GPIO_ResetBits(GPIOE,GPIO_Pin_5); //LED1对应引脚GPIOE.5拉低,亮 等同LED1=0; //GPIO_ResetBits(GPIOB,GPIO_Pin_5);//LED0对应引脚GPIOB.5拉低,亮 等同LED0=0 //GPIO_SetBits(GPIOB,GPIO_Pin_8); Motor_1_PRun(); Motor_2_PRun(); } if(RxData == 0x02){ //后退 Motor_1_NRun(); Motor_2_NRun(); } if(RxData == 0x03){ //左转 TIM_SetCompare1(TIM3,190); } if(RxData == 0x04){ //回中 TIM_SetCompare1(TIM3,185); } if(RxData == 0x05){ TIM_SetCompare1(TIM3,180); //右转 } if(RxData == 0x06){ GPIO_SetBits(GPIOB,GPIO_Pin_8); } if(RxData == 0x07){ GPIO_ResetBits(GPIOB,GPIO_Pin_8); } if(RxData == 0x00){ //GPIO_SetBits(GPIOB,GPIO_Pin_5); //LED0对应引脚GPIOB.5拉高 //GPIO_SetBits(GPIOE,GPIO_Pin_5); //LED1对应引脚GPIOE.5拉高 //GPIO_ResetBits(GPIOB,GPIO_Pin_8); Motor_1_STOP(); Motor_2_STOP(); } } } 成品展示 请忽略这草率的走线和供电,因为我只是对自己所学的一个检验,并没有像51小车那样把走线完善好,至于为什么没有放在地上跑,这看着也很明显啊,走线不允许啊!!!而且这里我用的精英开发板,如果是要做项目还是推荐mini板啊。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1632 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1559 浏览 1 评论
985 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
688 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1605 浏览 2 评论
1869浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
655浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
525浏览 3评论
540浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
512浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 22:22 , Processed in 0.881577 second(s), Total 78, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号