欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > DOC文档下载  

    使用STM32CubeMx搭建平衡小车代码框架参考模板.doc

    • 资源ID:15005387       资源大小:593.50KB        全文页数:12页
    • 资源格式: DOC        下载积分:4
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要4
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    使用STM32CubeMx搭建平衡小车代码框架参考模板.doc

    使用STM32CubeMx快速搭建平衡小车代码框架硬件平台:STM32CubeMxHAL代码库:STM32F1xx项目平台:MDK5.17A1.项目总体框架如下:MPU6050的数据读取采用软件模拟IIC,可使用MPU的DMP库直接生成角度值,减轻MCU计算负担;(DMP库资源详见,正点原子MPU6050资料)电机驱动部分采用市面上常见的直流电机驱动,引脚分布如下:PWMA,PWMB,A0,A1,B0,B1;其中PWMA、PWMB为电机驱动信号;A0、A1、B0、B1为电机方向控制信号,其控制电平如下:A0A1电机高高 制动高低 正转低高反转低低停止其中,制动为电机锁死,而停止为电机停转;2.项目搭建:Step1.打开STM32CubeMX,单击“New Project”,选择芯片型号,STM32F103C8Tx。Step2.配置Debug,根据实际选择1 / 12Step3.配置外部时钟信号Step4.配置TIM2(PWM发生器)Step5.配置模拟IIC引脚Step6.配置电机控制引脚Step7.配置TIM3(用作微妙延时时钟),CubeMx生成的代码中不包含微妙延时,此部分用于实现模拟IIC的微妙延时Step8.配置USART1(用于串口调试)Step9.时钟配置注:关于输入时钟一定要按实际晶振频率填写,否则会造成时序混乱;Step10.TIM2参数配置(10KHz)Step11.配置TIM3(微妙延时定时器)定时器时钟频率的计算:定时器时钟频率:72MHz72MHz/(PSC+1)/ARR=72/(71+1)/1=1Mhz=1us;Step12.配置GPIO口Step13.生成项目配置至此,关于平衡小车的软件框架配置已全部完成,点击项目生成,进入MDK编写代码:代码片段1:微妙函数的实现#include "delay.h"#include "tim.h"void Delay_us(uint32_t us)uint16_t counter=us&0xffff;HAL_TIM_Base_Start(&htim3);_HAL_TIM_SetCounter(&htim3,counter);while(counter>1)counter=_HAL_TIM_GetCounter(&htim3);HAL_TIM_Base_Stop(&htim3);void Delay_ms(uint32_t ms)Delay_us(1000*ms);代码片段2 模拟IIC:#define HIGH1#define LOW0#define SDA_IN() GPIOB->CRL&=0x0FFFFFFF;GPIOB->CRL|=0x40000000;#define SDA_OUT() GPIOB->CRL&=0x0FFFFFFF;GPIOB->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_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_us(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(ucErrTime>250)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_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;t<8;t+) IIC_SDA(txd&0x80)>>7);txd<<=1; Delay_us(2); IIC_SCL(HIGH);Delay_us(2); IIC_SCL(LOW);Delay_us(2); uint8_t IIC_Read_Byte(uint8_t ack)uint8_t i,receive=0;SDA_IN(); for(i=0;i<8;i+ )IIC_SCL(LOW); Delay_us(2);IIC_SCL(HIGH);receive<<=1;if(READ_SDA)receive+; Delay_us(1); if (!ack)IIC_NAck();else IIC_Ack(); return receive;代码片段3 PID控制器/50#define P_DATA 70.0/25.5#define I_DATA 46.7/1.25#define D_DATA 0/以上三值需根据实际调整参数typedef struct PIDint SetPoint;double Proportion;double Integral;double Derivative;int LastError;int PrevError;PID;void IncPIDInit(PID* sptr)sptr->LastError=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;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_Dir1_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的代码即可;

    注意事项

    本文(使用STM32CubeMx搭建平衡小车代码框架参考模板.doc)为本站会员(doc321)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开