精华内容
下载资源
问答
  • STM32平衡车

    2018-09-09 17:22:31
    stm32平衡车源码,,
  • stm32平衡小车

    2018-09-12 23:03:24
    stm32平衡小车,有pid教程,滤波教程,还有源码,程序可用
  • ucosii stm32平衡小车

    2019-02-28 20:07:27
    stm32平衡车改ucosii
  • STM32平衡小车全套资料
  • STM32平衡小车的资料

    2018-07-01 23:31:41
    STM32平衡小车的资料,平衡小车(高配 (超声波、蓝牙遥控、自旋转))
  • 摄像头寻迹+stm32平衡车
  • STM32平衡车代码

    2015-06-28 10:53:15
    STM32平衡车代码,基于PID算法,可实现两轮直立小车制作的完整代码,成品代码,如需硬件资料可以联系微信工作平台:DIY-work
  • 使用NRF24L01控制STM32平衡车 前进 后退 向左 向右。
  • 自制stm32平衡车

    千次阅读 2019-11-06 09:57:18
    自制stm32平衡车 2019-06-20 19:34:53HES_C阅读数 259更多 马上高考了,没事写一篇制作平衡车的教程. 先来一个段子: 对于7,8号的高考,我们早就表明态度:不愿考,但也不怕考,必要时不得不考。面对高考的难...

    自制stm32平衡车

    2019-06-20 19:34:53 HES_C 阅读数 259更多

         马上高考了,没事写一篇制作平衡车的教程.

    先来一个段子:

    对于7,8号的高考,我们早就表明态度:不愿考,但也不怕考,必要时不得不考。面对高考的难易程度我们也给出了答案:易,大门敞开,难,奉陪到底。

    看看主图:

     

    这个平衡车是stm32主控+步进电机+3D打印制作的,成本非常低。

       首先我们需要准备一些材料

    1- 控制板 

       控制板可以在某宝买到,而且比较便宜,还送代码和资料:

    https://shop105354755.taobao.com/index.htm?spm=2013.1.w5002-2817193177.2.3d83dfe7KtCH7r

    这上面集成了,步进电机驱动,SPP蓝牙模块,姿态传感器,都是拔插的,很方便二次利用。

    2- 步进电机   用的是42步进电机

       步进电机的话,某宝有很多卖的

       

    3- 步进电机支架

         因为某宝上的支架太贵了,所以使用的是3D打印件。

         电机支架打印件stl:

    4- 电池支架

         这里也使用3D打印件stl:

      

    5- 控制板支架

         这里也使用3D打印件stl:

    6- 轮子

    7- 轮塞

       

        这里也使用3D打印件stl:

    8- 18650电池

    9-  一些螺丝和螺柱   m2* 5    m3*5  m4*5 都会用到, 螺柱用m3*20的

    这些材料在上面那家店铺基本都可以买到。

    基本集齐上述零件就可以完成一个平衡车了。控制板安装的好的话,参数都不用调。

    组装好的样子:

    打开手机app控制效果:整体效果还是很不错的,毕竟都没有调过参数。

    https://v.youku.com/v_show/id_XNDIxNTY4MzM0MA==.html?spm=a2h0k.11417342.soresults.dtitle

    主控板还预留超声波接口,有兴趣的伙伴可以试一下。

     

    展开全文
  • STM32平衡车.rar

    2020-07-06 17:59:34
    STM32平衡车源代码,包括原理图,代码详细注释。STM32F103C8T6各种驱动,源码包括姿态解算,步进电机控制,串级PID控制
  • 参赛作品《stm32平衡小车》-原理图.pdf
  • 平衡小车之家两轮平衡小车程序,包括arduino和STM32的程序及原理图,硬件参考资料,驱动和调试软件,开发环境软件和库文件,测速码盘电机详细讲解资料等,可以说是非常全面的
  • STM32平衡小车程序

    2018-04-25 09:34:46
    基于stm32单片机的两轮平衡小车,可以实现前进、后退、左转、右转。
  • STM32平衡小车】线性CCD( TSL1401CL)巡线-附件资源
  • 自制stm32平衡车PCB

    2020-06-25 09:20:25
    自制stm32两轮平衡车一体化PCB,集成了mpu6050,TB6612,蓝牙模块等一切必要外扩,一块PCB接入所有功能,大佬们轻踩,轻喷。
  • STM32平衡车代码.rar

    2019-08-09 15:35:48
    STM32单片机,陀螺仪,两轮自平衡平衡车,PID调节闭环系统!!
  • stm32平衡车程序

    2018-05-12 11:54:50
    平衡车的程序,内置了mpu6050的驱动,都是玩代码的请根据自己的实际硬件酌情更改,合适的pid效果非一般
  • STM32平衡车.zip

    2020-10-07 17:13:27
    内涵平衡车所有的资料,包括程序,硬件原理图与PCB,CAD图纸,视频演示,图片展示,下载绝对没什么问题,如果有问题,请私信我。
  • STM32平衡车资料

    2017-09-30 14:31:02
    非常好的关于平衡车的资料,看了之后可以收获很多东西
  • 毕业设计,平衡车 STM32 嵌入式 控制理论的经典应用 亚博平衡智能车的全套资料,很全很详细,值得学习!
  • STM32平衡小车】STM32定时器配置为编码器模式

    万次阅读 多人点赞 2018-10-20 08:27:00
    文章目录一、编码器模式理论储备二、STM32实战代码 一、编码器模式理论储备 通常为了提高精度我们会选择在上升沿和下降沿都进行计数! 还有一个非常重要的图这里也记录下 其中让人费解的应该是在第二列的相对信号...

    一、编码器原理

    如果两个信号相位差为90度,则这两个信号称为正交。由于两个信号相差90度,因此可以根据两个信号哪个先哪个后来判断方向、根据每个信号脉冲数量的多少及整个编码轮的周长就可以算出当前行走的距离、如果再加上定时器的话还可以计算出速度。

    二、为什么要用编码器

    在这里插入图片描述

    从上图可以看出,由于TI1,TI2一前一后有个90度的相位差,所以当出现这个相位差时就表示轮子旋转了一个角度。但有人会问了:既然都是脉冲,为什么不用普通IO中断?实际上如果是轮子一直正常旋转当然没有问题。仔细观察上图,如果出现了毛刺呢?这就是需要我们在软件中编写算法进行改正。于是,我们就会想到如果有个硬件能够处理这种情况那不是挺好吗?

    对应的硬件的编码器就来了~
    在这里插入图片描述

    我们看到STM32的硬件编码器还是很智能的,当TI1,TI2脉冲是连续产生的时候计数器加一次或减一次,而当某个接口产生了毛刺或抖动,则计数器计数不变,也就是说该接口能够容许抖动。

    在STM32中,编码器使用的是定时器接口,查阅STM32F103数据手册可知,定时器1,2,3,4,5和8有编码器的功能,而其他定时器没有注意,在这几个定时器中也只有CH1和CH2可以设置为编码器模式~

    三、STM32编码器配置相关

    输入信号TI1,TI2后经过输入滤波,边沿检测产生TI1FP1、TI2FP2,然后接到编码器模块。通过配置编码器的工作模式,就可以对编码器进行正向/反向计数。

    比如如果用的是定时器2,则对应的引脚是在PA0和PA1上

    通常为了提高精度我们会选择在上升沿和下降沿都进行计数

    在这里插入图片描述

    还有一个非常重要的图这里也记录下

    在这里插入图片描述

    其中让人费解的应该是在第二列的相对信号的电平,这里就来详细谈一下吧。

    其实也不难理解哈,我们上面也说了通常为了提高精度会在A、B两相的上升沿和下降沿都进行计数,那么对应在一个周期就可以计数四次,计数次数的增加也就意味着精度的提高!

    编码器模式下,如果此时处于正转,那么这四次计数应该都是加的。同理,如果是反转,那么这四次计数都是减的。那么问题来了,如何判断正反转呢?

    不就是在相对电平的基础上嘛!!!

    在这里插入图片描述

    仔细对照图中,在正转或者反转的情况下,A相对B的电平高低以及上表中列出的计数方向便可了然于心!!!

    选择编码器接口模式的方法是:

    • 如果计数器只在TI2的边沿计数,则置TIMx_SMCR寄存器中的 SMS=001
    • 如果只在TI1边沿计数,则置SMS=010
    • 如果计数器同时在TI1和TI2边沿计数,则置SMS=011

    通过设置TIMx_CCER寄存器中的CC1PCC2P位,可以选择TI1和TI2极性;如果需要,还可以 对输入滤波器进行编程。

    两个输入TI1和TI2被用来作为增量编码器的接口。假定计数器已经启动(TIMx_CR1 寄存器中的CEN=’1’),计数器由每次在TI1FP1或TI2FP2上的有效跳变驱动

    配置范例:

    CC1S=01(TIMx_CCMR1寄存器, IC1FP1映射到TI1)
    CC2S=01(TIMx_CCMR2寄存器, IC2FP2映射到TI2)
    CC1P=0(TIMx_CCER寄存器, IC1FP1不反相, IC1FP1=TI1)
    CC2P=0(TIMx_CCER寄存器, IC2FP2不反相, IC2FP2=TI2)
    SMS=011(TIMx_SMCR寄存器,所有的输入均在上升沿和下降沿有效).
    CEN=1(TIMx_CR1寄存器,计数器使能)
    

    四、STM32实战代码

    对了,必须要再说明的是编码器模式下只能对应一个定时器的CH1/CH2通道,也就是刚好接A、B相! Perfect!!!

    /*TIM2初始化为编码器接口*/
    void Encoder_Init_TIM2(void)
    {
    	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;  
    	TIM_ICInitTypeDef TIM_ICInitStructure;  
    	GPIO_InitTypeDef GPIO_InitStructure;
    	
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//使能定时器4的时钟
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能PA端口时钟
     
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;	//端口配置
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
    	GPIO_Init(GPIOA, &GPIO_InitStructure);					      //根据设定参数初始化GPIOA
    
    	TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
    	TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // 预分频器 
    	TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD; //设定计数器自动重装值
    	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//选择时钟分频:不分频
    	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM向上计数  
    	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
    	TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//使用编码器模式3
    	TIM_ICStructInit(&TIM_ICInitStructure);
    	TIM_ICInitStructure.TIM_ICFilter = 10;
    	TIM_ICInit(TIM2, &TIM_ICInitStructure);
    	TIM_ClearFlag(TIM2, TIM_FLAG_Update);//清除TIM的更新标志位
    	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
    	//Reset counter
    	TIM_SetCounter(TIM2,0);
    	TIM_Cmd(TIM2, ENABLE); 
    }
    
    /*TIM4初始化为编码器接口*/
    void Encoder_Init_TIM4(void)
    {
    	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;  
    	TIM_ICInitTypeDef TIM_ICInitStructure;  
    	GPIO_InitTypeDef GPIO_InitStructure;
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);//使能定时器4的时钟
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能PB端口时钟
    
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;	//端口配置
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
    	GPIO_Init(GPIOB, &GPIO_InitStructure);					      //根据设定参数初始化GPIOB
    
    	TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
    	TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // 预分频器 
    	TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD; //设定计数器自动重装值
    	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//选择时钟分频:不分频
    	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM向上计数  
    	TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
    	TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//使用编码器模式3
    	TIM_ICStructInit(&TIM_ICInitStructure);
    	TIM_ICInitStructure.TIM_ICFilter = 10;
    	TIM_ICInit(TIM4, &TIM_ICInitStructure);
    	TIM_ClearFlag(TIM4, TIM_FLAG_Update);//清除TIM的更新标志位
    	TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
    	//Reset counter
    	TIM_SetCounter(TIM4,0);
    	TIM_Cmd(TIM4, ENABLE); 
    }
    
    /*单位时间编码器计数 输入定时器 输出速度值*/
    int Read_Encoder(u8 TIMX)
    {
    	int Encoder_TIM;    
    	switch(TIMX)
    	{
    		case 2:  Encoder_TIM= (short)TIM2 -> CNT;  TIM2 -> CNT=0;break;
    		case 3:  Encoder_TIM= (short)TIM3 -> CNT;  TIM3 -> CNT=0;break;	
    		case 4:  Encoder_TIM= (short)TIM4 -> CNT;  TIM4 -> CNT=0;break;	
    		default:  Encoder_TIM=0;
    	}
    	return Encoder_TIM;
    }
    
    void TIM4_IRQHandler(void)
    { 		    		  			    
    	if(TIM4->SR&0X0001)//溢出中断
    	{    				   				     	    	
    	}				   
    	TIM4->SR&=~(1<<0);//清除中断标志位 	    
    }
    
    void TIM2_IRQHandler(void)
    { 		    		  			    
    	if(TIM2->SR&0X0001)//溢出中断
    	{    				   				     	    	
    	}				   
    	TIM2->SR&=~(1<<0);//清除中断标志位 	    
    }
    

    五、经验之谈

    1、编码器有个转速上限,超过这个上限是不能正常工作的,这个是硬件的限制,原则上线数越多转速就越低,这点在选型时要注意,编码器的输出一般是开漏的,所以单片机的io一定要上拉输入状态。【平衡小车之家的编码电机已经有硬件上拉

    2、定时器初始化好以后,任何时候CNT寄存器的值就是编码器的位置信息,正转他会加,反转他会减。这部分是不需要软件干预的,初始化时给的TIM_Period 值是码盘整圈的刻度值,在减溢出会自动修正为这个数,加超过此数值就回0.。

    3、如果要扩展成多圈计数需要溢出中断,程序上圈计数加减方向位就行了.。

    4、每个定时器的输入脚可以通过软件设定滤波

    5、应用中如果没有绝对位置信号,或者初始化完成后还没有收到绝对位置信号前的计数只能是相对计数,收到绝对位置信号后重新修改一次CNT的值就行了。码盘一般都有零位置信号,结合到定时器捕获输入就行,上电以后要往返运动一下找到这个位置。

    6、即便是滤波计数,值偶尔也会有出错误的情况,一圈多计一个或少计一个数都是很正常的。特别是转速比较高的时候,尤其明显,有个绝对位置信号做修正是很有必要的绝对位置信号不需要一定在零位置点,收到这个信号就将CNT修正为一个固定的数值即可.。

    7、开启定时器的输入中断可以达到每个步计数都作处理的效果,但是高速运转的时候可能会处理不过来。


    参考

    [1] https://blog.csdn.net/Zach_z/article/details/75095061

    [2] https://blog.csdn.net/qq_17280755/article/details/73770598

    [3] https://blog.csdn.net/muyidian/article/details/79000721

    展开全文
  • STM32平衡小车】平衡小车的PID环体会心得

    万次阅读 多人点赞 2018-12-04 15:28:07
    } 速度环的kp范围确定 测速是通过 STM32 定时器的编码器接口模式对编码器进行四倍频(软件实现,提高精度),并使用 M法测速(每 10ms 的脉冲数)得到小车的速度。 通过实验,实际串口输出,小车满速旋转时左右轮...

    2018年12月11日17:47:56更新:

    平衡环:
    P可增加响应速度
    P过小,响应太慢,不能达到直立。
    P过大,会出现大幅度的低频抖动。

    D可消除P大了之后产生的大幅低频抖动。
    D过大,会出现高频抖动。

    速度环:
    P可增加速度的响应,I和P有比例关系I=P/200.
    P过小,响应慢,出现的现象是加速减速慢,迟钝。
    P过大,会出现低频抖动。

    转向环
    P过下,转弯不及时
    P过大,大幅度抖动


    两个东西待解决

    1、左右轮编码器之和数值输出的范围确定
    2、小车转向的gyro范围确定


    一、机械中值的确定

    不管是那个环,小车物理人为的短时直立,这个必须要做到,不然调试任何参数,任何环都是扯。

    机械中值的确定方法,通过OLED上显示的陀螺仪倾角确定,存在某一个角度是前倾和后仰的临界点,这个点对应的角度就是ZHONGZHI.

    二、直立环(PD)

    • 开始调试直立环时,需要先关闭速度环和转向环。
    • 单独的直立环不足以让小车直立,最基本的环=直立环+速度环
    • 直立环代码实现
    
    //直立环的最基本代码实现
    //Angle-小车倾角 Gyro-Y 轴陀螺仪(前进方向是 MPU6050 的 X 轴的正方向,电机轴与 Y 轴平行。)
    int balance(float Angle,float Gyro)
    {
    	float Bias,kp=300,kd=1;
    	int balance;
    	
    	Bias=Angle-0; //计算直立偏差
    	balance=kp*Bias+Gyro*kd; //计算直立 PWM
    	return balance; //返回直立 PWM
    }
    
    • 直立环的Kp范围确定

      • MiniBalance_PWM_Init(7199,0);可以知道,7200对应的占空比是100%
      • 再由PID的基本代码可知,假如设定kp=720,那么在±10°左右,电机即可实现满转。
      • 我们根据电机直立的摆幅,差不多就要≤10°,不然就抖的太厉害了。所以我们设定kp的可选范围也就限制在了≤720
    • 直立环的kp极性确定

      • 这个可以直接给kp正负值,然后放在地上观察现象, 正常出现的现象是一个负反馈,而不是出现往哪边倒就往另一边加速,致使它快速倒下,而是往要倒的方向去追(跟后面的速度环kp极性确定大同小异)。
    • 直立环的kp大下确定

      • 试参数,从小到大,响应慢慢加快, 直到出现大幅度的低频抖动选定此时的Kp,接下来进行速度环的kd确定。
    • 直立环的kd极性确定

      • kp置为0,然后给Kd正负值分别实验,当拿起小车旋转时,小车轮子没有实现跟随,这个时候说明极性是反的!
    • 直立环的kd大小确定

      • 注意,是在抖动的kp基础上,调试kd大小。依旧是从小到大实验,一直到小车出现高频的剧烈抖动

    此时kp,kd同时乘上0.6,就是一组合适的直立参数,可以发现不会抖了,但是小车也仍旧不能一直保持直立,原因是单独的直立环不足以实现小车直立,还需要配合速度环。

    三、速度环(PI)

    • 积分控制和比例控制的极性是相同的,且有一定的比例关系。(这里确定为200)

    • 直立小车,速度环是一种对直立环的干扰,所以我们还依旧要让直立环处于主导地位,要对速度环进行适当的低通滤波处理。

    • 直立环的基础代码实现

    //输入左右轮电机编码器
    int velocity(int encoder_left,int encoder_right)
    {
    	static float Velocity,Encoder_Least,Encoder;
    	static float Encoder_Integral;
    	
    	float kp=80,ki=0.4;
    	Encoder_Least =(Encoder_Left+Encoder_Right)-0;
    	Encoder *= 0.7;
    	Encoder += Encoder_Least*0.3;
    	Encoder_Integral +=Encoder;
    	Velocity=Encoder*kp+Encoder_Integral*ki;
    	return Velocity;
    }
    
    • 速度环的kp范围确定

      • 测速是通过 STM32 定时器的编码器接口模式对编码器进行四倍频(软件实现,提高精度),并使用 M法测速(每 10ms 的脉冲数)得到小车的速度。
      • 通过实验,实际串口输出,小车满速旋转时左右轮编码器相加可达160,假设速度偏差达到50%时满转。,160/2=80,7200/80=90,也就说kp最大为90(注意这里只是在假设50%的前提下).
    • 速度环的kp极性确定

      • 极性判断,需要先关闭直立环和转向环。
      • 要想达到直立,速度环这里正反馈,意思就是假如向前倒,那么小车就要以更快的速度向前冲,保持直立。
      • Encoder_Least =(Encoder_Left+Encoder_Right)-0;Encoder_Least -是速度偏差,(Encoder_Left+Encoder_Right)是当前速度值,0-是目标速度值,可知,当旋转其中一个轮子,两个轮子往相同方向旋转,到速度最大值。
    • 速度环的kp大小确定

      • 大小确定打开直立环。
      • kp,ki同符合且有ki=kp/200的比例关系
      • kp,ki逐步增大,直到使得小车的响应迅速稳定,即是合适的PI参数。

    遥控的加入

    int velocity(int encoder_left,int encoder_right)
    {
    	static float Velocity,Encoder_Least,Encoder,Movement;
    	static float Encoder_Integral;
    	
    	float kp=80,ki=0.4;
    	if(1==Flag_Qian) Movement=-90; //===如果前进标志位置 1 位移为负
    	else if(1==Flag_Hou) Movement=90; //===如果后退标志位置 1 位移为正
    	else Movement=0;
    	Encoder_Least =(Encoder_Left+Encoder_Right)-0; //获取最新速度偏差==测量速度(左
    	右编码器之和)-目标速度(此处为零)
    	Encoder *= 0.7; //===一阶低通滤波器
    	Encoder += Encoder_Least*0.3; //===一阶低通滤波器
    	Encoder_Integral +=Encoder; //===积分出位移 积分时间:10ms
    	Encoder_Integral=Encoder_Integral-Movement; //接收遥控器数据,控制前进后退
    	if(Encoder_Integral>10000) Encoder_Integral=10000; //积分限幅
    	if(Encoder_Integral<-10000) Encoder_Integral=-10000; //限制遥控最大速度
    	Velocity=Encoder*kp+Encoder_Integral*ki; //===速度控制
    	if(Turn_Off(Angle_Balance,Voltage)==1) Encoder_Integral=0; //电机关闭后清除积分
    	return Velocity;
    }
    
    
    //其中Encoder_Integral=Encoder_Integral-Movement; 遥控的速度通过积分融入
    速度控制器,减缓了速度突变对直立控制的影响。
    //积分限幅中的最大赋值决定了小车的最大前进速度,而 Movement 值决定了小车的给定速度。
    

    四、转向环§

    • 基本原理
      • 使用 Z 轴陀螺仪的数据作为转向速度偏差进行 P 控制,目标是保持转向速度为设定值。
    • 基本代码实现
    //gyro是陀螺仪的y轴,电机方向.
    int turn(int encoder_left,int encoder_right,float gyro)
    {
    	float Turn,Kp=1,Bias;
    	
    	Bias=gyro-0;
    	Turn=-Bias*Kp;
    	return Turn;
    }
    
    • 直立环kp的极性判断

      • 调试小车转向环,需要关闭直立环和速度环
      • 实际通过串口观察gyro的值,我们发现它最大不过4位,根据 7200 代表占空比 100%,所以我们估算 kp 值应该在 0~2 之间。
      • 取合适的正负值实验,正常是我们把小车按在地上,旋转小车,小车会有抵抗,阻止旋转。
    • 直立环kp的大小确定

      • 逐步增加kp值,直到有走直线效果良好。

    遥控功能加入

    int turn(int encoder_left,int encoder_right,float gyro)
    {
    	float Turn,Kp=1,Bias;
    	if(1==Flag_Left) Turn_Amplitude=1100;
    	else if(1==Flag_Right) Turn_Amplitude=-1100;
    	else Turn_Amplitude=0;
    	Bias=gyro-0;
    	Turn=-Bias*Kp;
    	Turn+=Amplitude;
    	return Turn;
    }
    
    
    //其中Turn+=Amplitude; 转向遥控叠加在转向控制里面。
    
    展开全文
  • stm32平衡小车.zip

    2020-03-12 22:33:18
    包含两个工程,一个是买的时候商家送的,一个是自己花一个月写出来了,既能帮助初学者入门,又适合进阶,代码均有详细注释
  • 自己设计的基于STM32F103的平衡小车PCB板,相比其他普通平衡小车的板子增加了电机驱动的高速光耦隔离和按键的光耦隔离。也就对电源进行了隔离设计,其实没多大用处就是自己练手而已。四层板。此版本还没有经过打样和...
  • 自己设计的基于STM32F103的平衡小车PCB板,相比其他普通平衡小车的板子增加了电机驱动的高速光耦隔离和按键的光耦隔离。也就对电源进行了隔离设计,其实没多大用处就是自己练手而已。四层板。此版本还没有经过打样和...
  • 详细记录平衡小车的全部过程,参数的调试,动力学的分析
  • 鸭脖智能平衡车全套资料,包含硬件资料,软件资料,原理图,理论基础,源码等全套资料。另附STM32小车循迹避障(原),没用过,应该是源码。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 451
精华内容 180
关键字:

stm32平衡车