ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:431.50KB ,
资源ID:11932612      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11932612.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(使用STM32CubeMx搭建平衡小车代码框架.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

使用STM32CubeMx搭建平衡小车代码框架.docx

1、使用STM32CubeMx搭建平衡小车代码框架使用STM32CubeMx快速搭建平衡小车代码框架硬件平台:STM32CubeMxHAL代码库:STM32F1xx项目平台:MDK5.17A1.项目总体框架如下:MPU6050的数据读取采用软件模拟IIC,可使用MPU的DMP库直接生成角度值,减轻MCU计算负担;(DMP库资源详见,正点原子MPU6050资料)电机驱动部分采用市面上常见的直流电机驱动,引脚分布如下:PWMA,PWMB,A0,A1,B0,B1;其中PWMA、PWMB为电机驱动信号;A0、A1、B0、B1为电机方向控制信号,其控制电平如下:A0 A1 电机高 高 制动高 低 正转低 高

2、 反转低 低 停止其中,制动为电机锁死,而停止为电机停转;2.项目搭建:Step1.打开STM32CubeMX,单击“New Project”,选择芯片型号,STM32F103C8Tx。Step2.配置Debug,根据实际选择Step3.配置外部时钟信号Step4.配置TIM2(PWM发生器)Step5.配置模拟IIC引脚Step6.配置电机控制引脚Step7.配置TIM3(用作微妙延时时钟),CubeMx生成的代码中不包含微妙延时,此部分用于实现模拟IIC的微妙延时Step8.配置USART1(用于串口调试)Step9.时钟配置注:关于输入时钟一定要按实际晶振频率填写,否则会造成时序混乱;S

3、tep10.TIM2参数配置(10KHz)Step11.配置TIM3(微妙延时定时器)定时器时钟频率的计算:定时器时钟频率:72MHz72MHz/(PSC+1)/ARR=72/(71+1)/1=1Mhz=1us;Step12.配置GPIO口Step13.生成项目配置至此,关于平衡小车的软件框架配置已全部完成,点击项目生成,进入MDK编写代码:代码片段1:微妙函数的实现#include delay.h#include tim.hvoid Delay_us(uint32_t us) uint16_t counter=us&0xffff; HAL_TIM_Base_Start(&htim3); _H

4、AL_TIM_SetCounter(&htim3,counter); while(counter1) counter=_HAL_TIM_GetCounter(&htim3); HAL_TIM_Base_Stop(&htim3);void Delay_ms(uint32_t ms) Delay_us(1000*ms);代码片段2 模拟IIC:#define HIGH 1#define LOW 0#define SDA_IN() GPIOB-CRL&=0x0FFFFFFF;GPIOB-CRL|=0x40000000;#define SDA_OUT() GPIOB-CRL&=0x0FFFFFFF;G

5、PIOB-CRL|=0x10000000; #define IIC_SCL(n) (n?HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET) /SCL#define IIC_SDA(n) (n?HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET) /SDA#define READ_SDA HAL_GPIO_

6、ReadPin(GPIOB,GPIO_PIN_7) void IIC_Init(void) IIC_SDA(HIGH); IIC_SCL(HIGH);void IIC_Start(void) SDA_OUT(); IIC_SDA(HIGH); IIC_SCL(HIGH); Delay_us(4); IIC_SDA(LOW); Delay_us(4); IIC_SCL(LOW); void IIC_Stop(void) SDA_OUT(); IIC_SCL(LOW); IIC_SDA(LOW); Delay_us(4); IIC_SCL(HIGH); IIC_SDA(HIGH); Delay_u

7、s(4); uint8_t IIC_Wait_Ack(void) uint8_t ucErrTime=0; SDA_IN(); IIC_SDA(HIGH);Delay_us(1); IIC_SCL(HIGH);Delay_us(1); while(READ_SDA) ucErrTime+; if(ucErrTime250) IIC_Stop(); return 1; IIC_SCL(LOW); return 0; void IIC_Ack(void) IIC_SCL(LOW); SDA_OUT(); IIC_SDA(LOW); Delay_us(2); IIC_SCL(HIGH); Delay

8、_us(2); IIC_SCL(LOW); void IIC_NAck(void) IIC_SCL(LOW); SDA_OUT(); IIC_SDA(HIGH); Delay_us(2); IIC_SCL(HIGH); Delay_us(2); IIC_SCL(LOW); void IIC_Send_Byte(uint8_t txd) uint8_t t; SDA_OUT(); IIC_SCL(LOW); for(t=0;t7); txd=1; Delay_us(2); IIC_SCL(HIGH); Delay_us(2); IIC_SCL(LOW); Delay_us(2); uint8_t

9、 IIC_Read_Byte(uint8_t ack) uint8_t i,receive=0; SDA_IN(); for(i=0;i8;i+ ) IIC_SCL(LOW); Delay_us(2); IIC_SCL(HIGH); receiveLastError=0; sptr-PrevError=0; sptr-Proportion=P_DATA; sptr-Integral=I_DATA; sptr-Derivative=D_DATA; sptr-SetPoint=0;int IncPIDCalc(PID* sptr,int nextPoint) int iError,iIncpid;

10、 iError=sptr-SetPoint-nextPoint; iIncpid=sptr-Proportion*iError- sptr-Integral*sptr-LastError+ sptr-Derivative*sptr-PrevError; sptr-PrevError=sptr-LastError; sptr-LastError=iError; return iIncpid;代码片段4 PWM发生器 HAL_GPIO_WritePin(Left_Dir0_GPIO_Port,Left_Dir0_Pin,GPIO_PIN_SET); HAL_GPIO_WritePin(Left_D

11、ir1_GPIO_Port,Left_Dir1_Pin,GPIO_PIN_RESET); HAL_GPIO_WritePin(Right_Dir0_GPIO_Port,Right_Dir0_Pin,GPIO_PIN_SET); HAL_GPIO_WritePin(Right_Dir1_GPIO_Port,Right_Dir1_Pin,GPIO_PIN_RESET); _HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_1,0); _HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,0); HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);注:更改PWM的占空比使用HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_1,val)函数即可,其占空比的为用户设定的值除以ARR的值,即val/99+1;即val直接等于占空比;后记:关于DMP的代码直接参考正点原子的MPU6050的代码即可;如有侵权请联系告知删除,感谢你们的配合!

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1