目录:
一:小车组装以及例程的运行
1、小车开箱
2、组装小车
3、下载程序
4、运行效果
二:我的程序
2、点亮LED的实验
4、编码器显示速度测试(编码器模块) (已更新)
6、调试陀螺仪(倾角测量模块) (未更新)
7、反馈算法调试(PID模块) (未更新)
	
今天先来个开箱:
	
 
 
	
 
)(待更新))(待更新))(待更新)http://forum.eepw.com.cn/thread/275647/1#2
在因为忙于期末考试等原因沉寂了都快两个月了后,jokernl的学习进程要继续更新了:
	
今天的内容是,工程的调试下载:
	
 
第一步:打开官方提供的例程:
	
 
	
 
第二步:编译和下载
	
如下图所示,几个按钮的用途
	
 
我先进行了编译,成功,没有什么问题:
	
	
 
	
然后接好SWD仿真器,但是下载失败了。
	应该是需要改选项,点击选项图标
进入选项窗口——Debug选项卡,使用J-LINK仿真器。 
	
 
在Utilities也需要更改一下。
	
 
连上J-link,可以在设备管理器里面看见:
	
 
这时候点击刚刚那个Debug选项卡的仿真器后面的setting
就会弹出如下窗口:
	
 
PORT选择SW,可以看见一个SWD仿真器。
	
接下来就可以下载了。
	
本来准备基于例程修改功能。
前几天看了看例程,直接寄存器操作我就不说了,操作寄存器居然是去操作地址,这代码一定是很厉害的人写了,可能是用过DSP的习惯?也可能是为了防止太多人移植,毕竟这也是人的劳动成果!
但是我作为STM32初学者对那些底层基本上看不懂呀!
		
	
决定自己重写,基于ST官方3.50的库
		
	
这是官方的库文件:
这是我用库文件以及做好的工程模板:
			
		
			
		
简单程序调试:
点蓝灯程序的main文件程序如下,工程其他和楼上的工程模板完全一样,只需要替换一下main.c即可,该程序很短,也很简单,先初始化IO口,然后再main函数中将其置低电平,即可点亮。
/**
  **************************
  * 基于3.5.0版本库的工程模板
  **************************
  * 用于平衡小车的程序
  * EEPW 账号:jokernl
  **************************
  */
  
#include "stm32f10x.h"
void LED_GPIO_Config(void)
{ 
  GPIO_InitTypeDef Bule_LED;  //定义GPIO结构体
       RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //IO时钟打开
       Bule_LED.GPIO_Pin=GPIO_Pin_8;         //设定管脚PB8
       Bule_LED.GPIO_Mode=GPIO_Mode_Out_PP;   //设定推挽输出
       Bule_LED.GPIO_Speed=GPIO_Speed_50MHz;  //设定50Mhz
       GPIO_Init(GPIOB,&Bule_LED);  	//进行初始化       
}
/**
  * @brief  主函数
  */
int main(void)
{
LED_GPIO_Config();
GPIO_ResetBits(GPIOB, GPIO_Pin_8);//根据电路图知,PB8低电平时该灯点亮
  
while(1)
{
}
}
 
 
	
		
	
		
	
二,驱动电机正反转实验程序
看了下驱动电路的电路图,可以看见 左边电机是由 PB0 PB12 PB13 控制;右边边电机是由PB1 PB14 PB15 控制。
其中PB0/PB1为 PWM的控制,其他IO控制正反转使用。
本实验将PWM全置高,试试电机的正反转,也很简单,比楼上的点亮LED并没有复杂太多。
	
LED是PB8 ,电机驱动IO是PB0 PB1 PB12 PB13 PB14 PB15,都属于PB,且都为输出,为了方便初始化,我干脆写了个GPIOB的输出初始化函,参数为具体管脚,可以方便的反复调用:
	/* 带参宏, 右电机相关IO */
#define  PB0(on)  if (on)  GPIO_SetBits(GPIOB,GPIO_Pin_0); \
 else   GPIO_ResetBits(GPIOB,GPIO_Pin_0) 
#define  PB12(on) if (on)  GPIO_SetBits(GPIOB,GPIO_Pin_12); \
 else   GPIO_ResetBits(GPIOB,GPIO_Pin_12)
#define  PB13(on) if (on)  GPIO_SetBits(GPIOB,GPIO_Pin_13); \
 else   GPIO_ResetBits(GPIOB,GPIO_Pin_13)
 
/* 带参宏, 左电机相关IO */ 
#define  PB1(on)  if (on)  GPIO_SetBits(GPIOB,GPIO_Pin_1);    \
 else   GPIO_ResetBits(GPIOB,GPIO_Pin_1) 
#define  PB14(on) if (on)  GPIO_SetBits(GPIOB,GPIO_Pin_14);    \
 else   GPIO_ResetBits(GPIOB,GPIO_Pin_14)
#define  PB15(on) if (on)  GPIO_SetBits(GPIOB,GPIO_Pin_15);    \  
其中\为续行符,就是下一行接着的意思,因为#define必须写在一行嘛,我这样写是为了看起来整齐,关于带参数宏,部分C语言初学者可能看不懂,可以参考#define_百度百科 中对带参宏定义的介绍,并不难,而且用起来很方便。
		
	
接着我继续用宏定义,定义了LED的操作,以及电机的正反转或者制动操作,方便调用:
		/* 带参宏,蓝灯低电平点亮, Blue_LED(1)为开蓝灯,Blue_LED(0)为关闭蓝灯 */
#define  Blue_LED(on) if (on) GPIO_ResetBits(GPIOB,GPIO_Pin_8);\
   else  GPIO_SetBits(GPIOB,GPIO_Pin_8) 
	
		
			#define Motor_R(a) PB12(a);PB13(!a)       //a=1 时 ,向前转,a=0时,向后转。 
#define Motor_L(a) PB15(a);PB14(!a)       //a=1 时 ,向前转,a=0时,向后转。 
#define Motor_Rs  GPIO_SetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_13) //右轮制动 
#define Motor_Ls  GPIO_SetBits(GPIOB,GPIO_Pin_14|GPIO_Pin_15) //左轮制动
		
		
			
		
这是一个很无脑的延时函数,仅供调试使用:
			/**
 * @brief  无脑延时
 */
void Delay(__IO uint32_t nCount)  //简单的延时函数
{
 for(; nCount != 0; nCount--);
} 
		
			
		
下面是主函数,想初始化各个IO口,然后先后让电机正反转,这样,实验就完成了,其中亮灯关灯用来做效果对比,方便知道程序运行到哪里了,如果用SWD调试可以更方便的查看程序的运行。
				
/**
 * @brief  主函数
 */
 int main(void)
 {
 PB_OUT_Config(GPIO_Pin_8|GPIO_Pin_0|GPIO_Pin_13|GPIO_Pin_12|GPIO_Pin_1|GPIO_Pin_14|GPIO_Pin_15); //配置输出管脚
 PB0(1);  PB1(1); //电机的PWM为全高
 while(1)
 {
 Blue_LED(1);  //开灯 
 Motor_R(1);   //右正转
 Motor_L(0);   //左反转 
 Delay(1000000);
 Motor_R(0);   //右反转
 Motor_L(1);   //左正转
 Delay(1000000); 
 Blue_LED(0);  //关灯 
 Motor_Rs;  Motor_Ls; //制动 
 Delay(1000000); 
 Delay(1000000); 
 }
 }
				
					
				
该实验的工程文件:J_car_beta0.01(电机驱动尝试)
| 有奖活动 | |
|---|---|
| 硬核工程师专属补给计划——填盲盒 | |
| “我踩过的那些坑”主题活动——第002期 | |
| 【EEPW电子工程师创研计划】技术变现通道已开启~ | |
| 发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
| 【EEPW在线】E起听工程师的声音! | |
| 高校联络员开始招募啦!有惊喜!! | |
| 【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
| 送您一块开发板,2025年“我要开发板活动”又开始了! | |