一、电机驱动:
1.首先是定时器和pwm初始化,套路就是1.开启RCC时钟。2.初始化时基单元。时基单元包括了一些参数,比如预分频器psc,计数器cnt,还有就是自动重装器arr。3.初始化输出pwm波要用到的几个GPIO口,IO口配置为复用推挽输出。4.初始化输出比较单元,包括了定时器模式,输出使能,输出极性这些参数。5.上面的几个,基本都是通过结构体的形式来初始化的。6.由于我用的是TIM1也就是stm32的高级定时器,所以在最后启动计数器时,还必须要调用TIM_CtrlPWMOutputs函数来输出使能。
1.我用的是TB6612驱动模块,来对小车进行一个运动的控制。TB6612是5V供电,输入口和输出口共8个,还有两个PWM输入口(AIN1,AIN2,BIN1,BIN2,AO1,AO2,BO1,BO2,PWMA,PWMB)。对于小车的运动,主要通过模块化编程来实现,比如实现一个前进功能,编写一个函数,给电机的两个IO输入不同的电平,然后再调用pwm输出函数给一个pwm波,就可以实现前进的功能。电机型号是有刷直流电机。
2.在STM32中文参考手册里的定时器复用功能重映射,可以看到每个定时器用到的对应IO口说明。
舵机PWM用到PA6,电机PA8,PA11。
二、对于舵机的计算
比如舵机sg90,周期为20ms,因此通过配置ARR和PSC就可以实现,因为总时间是确定的20ms,假设ARR为1000,可以计算出psc的值为1440。因此psc初始化为1440,arr初始化为1000。由舵机使用手册可知,转动90度对应的是7.5%的占空比,因此输出占空比函数的参数填75即可。75/1000=0.075=7.5%
舵机的参考点是0,因此如果本来就在45度的位置,再给他一个转动90度的命令的话,舵机会再转45度,而不是90度。
让舵机摇头,给他三个输出不同pwm波的函数,中间要加延时函数。即可实现一直摇头。
三、小车循迹功能
用到的是TCRT5000红外传感器。引脚有四个VCC,GND,DO,AO。用到的是DO口,也就是数字量。原理是,当给这个传感器上电以后,会通过红外管发射红外线,当射到黑线时不会返回回来,此时DO引脚会变成高电平,也就是这个触发方式为上升沿触发,引脚配置给他默认为下拉输入。这个过程从原理上来说和按键外部中断是一样的。
因此需要进行外部中断配置,外部中断配置涉及到GPIO,AFIO(AFIO就是一个数据选择器嘛,对GPIO过来的通道进行选择,也就是PA0,PB0,PC0这样的引脚不能同时用作外部中断),EXTI(EXTI就是外部中断寄存器,需要在这里配置触发方式,比如上升沿触发,下降沿,双边沿,还有选择响应方式,包括中断响应和事件响应,一般用中断响应),最后到NVIC(NVIC就是一个处理和配置中断优先级的寄存器,处理完之后会直接告诉CPU,先处理哪个中断,这里需要配置中断优先级,包括抢占优先级和响应优先级,还有选择中断通道。这里需要注意的是,通道5-9和通道15-10,这里简化了到NVIC的通道数,减少了NVIC的负担)。
这里需要注意的是,就好像我们配置按键时,会出现一个key,这个key是我们定义的,那么怎么让这个key跟我们的红外发射管传回来的值相对应呢,通过宏定义的方式,key作为宏体,宏名是一个GPIO读取函数,这个函数是库函数内部的,读取需要配置的参数有GPIO的选择还有引脚选择。这样,我们的key就和外部的红外管连起来了,因此在写程序时,直接用这个key来判断,小车中配置了4路红外管,因此通过简单的判断语句,if(key=0&&key=0&&key=0&&key=0),通过检测这个变化,来让小车自动左转还是右转,达到一个循迹的效果。
这里涉及到的好几个外设,只有GPIO和AFIO是需要开启时钟的,其他的EXTI和NVIC的时钟是默认开启,无需我们打开。GPIO口配置的时候配置为下拉输入,这个输入输出模式可以参考STM32的中文手册中GPIO配置来进行选择,中文参考手册里也会有IO口容忍电压,比如容忍电压为3.3V,那么这个IO口上的设备只能接3.3V而不能接5V,这个在画原理图的时候要注意。还有就是要注意用到的引脚有没有复用功能重映射问题,如果有的话,需要对其进行配置,例如我当时用到的PB4和PB3,这两个引脚在复位以后,功能会改变,这个时候需要关闭JTAG,启用SW才可以正常使用,这里就是加一个函数对其进行配置即可。配置完GPIO以后就到AFIO了,AFIO作为一个数据选择器,加一个通道选择函数即可,比如选择了PB14,那么配置为GPIOB以及通道14即可。然后到EXTI,这里进行中断线选择,配置响应方式,是中断响应还是事件响应,事件响应不经过CPU直接到其他外设,还有最重要的是配置触发方式,这个触发方式根据传感器工作方式来配置,比如红外管在发射到黑线上时,DO数字口由低电平变高电平,因此,触发方式选择上升沿。最后到NVIC,配置中断优先级分组,配置抢占优先级和响应优先级,注意抢占优先级和响应优先级不能超出中断分组给定的范围,还有就是通道选择,注意比如14的通道,是属于15-10这个通道里的,这个在写中断服务函数时,需要检查标志位和清除标志位,标志位不清除会导致中断一直执行。这样,外部中断配置就好了,当红外管发生响应时,中断就会经过这一条通路,来到CPU,CPU就会执行这个中断,程序就会从主程序跳到中断程序中执行。
四、蓝牙模块驱动小车
1.硬件上:HC05蓝牙模块控制小车的运动,首先要利用电脑串口助手来配置好蓝牙模块的波特率为115200,并且通过AT指令修改好蓝牙名称和密码。
2.代码:代码包括初始化串口,包括GPIO口初始化(TX配置为复用推挽输出,RX配置为浮空输入),USART初始化(波特率,数据长度,奇偶校验位以及收发模式配置),NVIC初始化(配置好通道和优先级),最后再开启串口中断和使能串口。
初始化完成以后,即可完成收发数据的首要条件。然后就是想要通过手机控制小车的话,手机上安装一个蓝牙助手,发送指令到单片机上。接收指令调用USART_ReceiveData函数,再设置一个res变量,用来存函数中的值,最后再通过一个标志位,也是一个变量,if(res='A') flag1=1,这样,通过判断flag的值,即可知道传过来的是什么值,上面这段代码要写在串口中断服务函数里。最后再写一段if(flag等于几),就完成什么操作。