目录:
一:小车组装以及例程的运行
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(电机驱动尝试)