当前位置:   article > 正文

用stm32模拟遥控器初始化电调(电调解锁)(电调行程校准)(附百度云例程)_stm32控制电调

stm32控制电调

用stm32模拟遥控器初始化电调(电调行程校准)(电调解锁)

亲测可用的例程
链接:https://pan.baidu.com/s/1MwcWBU15Z7YJ3Dz0mA15ew
提取码:1234

  • 硬件

stm32f103c8t6,
好盈X-Rotor 40A,
一个淘宝大疆电机

  • 定义的管脚
    请大家进工程自己看吧,时间太长我也记不得了。
    应该是定义了三个开关,一路PWM,一路串口。
    看前须知
  1. 对电调的控制和对舵机的控制很相似,都是使用pwm输出一串方波进行控制。
  2. 使用32初始化pwm,默认大家都有所了解。
  3. 使用万用表测量频率,COM端接pwm信号线,另一根表笔接地,如此测出的频率才正确,反之则会大一倍。
  4. 电调在一个pwm方波周期内识别的是脉宽的长度,而不是占空比,最高油门是2ms的脉宽,最低油门是1ms的脉宽(为什么不是占空比呢,因为频率不同,相同的脉宽,体现出的占空比不同)。
  5. 由于硬件不同,精确的驱动脉宽并不是完全精确的1ms-2ms,而左右有浮动。但是1ms-2ms的脉宽很有普适性(不管准不准,先让电机转起来再说,不然大佬们也不会在这看在下的这篇文章了,手动滑稽)。
  6. 哔哔的的声音是电调控制电机发出的。
  7. PWM初始化时,预分频系数psc为71时,CNT计数器的时钟为1MHz(说明每1秒使计数器加1000,000次=计数器每1us加1次),此时arr(自动重装载值),ccr(捕获比较寄存器的值)的值都有了实际的物理意义(arr表示周期长度,crr表示脉宽长度(在PWM1模式下))
    请添加图片描述

怎么用stm32初始化电调
实验设备:好盈X-Rotor 40A电调
实验思路:模拟遥控器的动作去初始化电调,遥控器初始化电调的方法如下图
油门行程校准·电调初始化·电调解锁是相同的操作
实验方法:
1.用stm32模拟遥控器的最高油门(输出脉宽为2ms的pwm波)(此时电调不上电)。
2.给电调上电(等待电机发出哔-哔-两声后)
3.再用stm32模拟遥控器的最低油门(输出脉宽为1ms的pwm波)。(此时电调长哔——
一声)
这样电调初始化(电调解锁,电调行程校准)就完成了。
实验操作:使用按键控制pwm的脉宽,来模拟遥控器的油门推杆
1>按下key0,使pwm的脉宽为2ms。
2>给电调上电(等待电机发出哔-哔-两声后)
3>按下key1,使pwm的脉宽为1ms。(此时电调长哔—— 一声)
这样电调初始化(电调解锁,电调行程校准)就完成了。

参考代码如下(仅供参考,不可直接copy)

例一(pwm初始化时,选择pwm2模式+高电平有效)

	unsigned char key;
	delay_init();	    	 //延时函数初始化	  
 	LED_Init();			     //LED端口初始化
 	TIM3_PWM_Init(19999,71);	 //50hz,  19999,71
 	TIM3_PWM_Init(arr,psc);	 //arr:自动重装载寄存器的值,psc:预分频系数
 	
	KEY_Init();
	delay_ms(100);
	while(1)
	{
 		key=KEY_Scan(0);	//得到键值
	   	if(key)
		{						   
			switch(key)
			{				 
				case KEY1:
						TIM_SetCompare2(TIM3,18997); 		   //1000us,18997
						//TIM_SetCompare2(TIMx,ccr); 		   //ccr:捕获比较寄存器的值						
						//当19999-18997=1002,即arr-ccr=1002时,脉宽为1ms
						GPIO_ResetBits(GPIOC,GPIO_Pin_13);		//小灯快闪两次,标志key1按下						 
						delay_ms(100);
				   		GPIO_SetBits(GPIOC,GPIO_Pin_13);						 
						delay_ms(100);
						GPIO_ResetBits(GPIOC,GPIO_Pin_13);						 
						delay_ms(100);
				    	GPIO_SetBits(GPIOC,GPIO_Pin_13);									
						break;
				case KEY0:	
						TIM_SetCompare2(TIM3,17997);          //2000us,17997
						//当19999-18997=2002,即arr-ccr=2002时,脉宽为2ms        
						GPIO_ResetBits(GPIOC,GPIO_Pin_13);	  //小灯常量	,key0按下				 
						break;
			}
		}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

例二(pwm初始化时,选择pwm1模式+高电平有效)

	unsigned char key;
	delay_init();	    	 //延时函数初始化	  
 	LED_Init();			     //LED端口初始化
 	TIM3_PWM_Init(19999,71);	 //50hz,  19999,71
 	TIM3_PWM_Init(arr,psc);	 //arr:自动重装载寄存器的值,psc:预分频系数
 	
	KEY_Init();
	delay_ms(100);
	while(1)
	{
 		key=KEY_Scan(0);	//得到键值
	   	if(key)
		{						   
			switch(key)
			{				 
				case KEY1:
						TIM_SetCompare2(TIM3,1003); 		   //1000us
						//TIM_SetCompare2(TIMx,ccr); 		   //ccr:捕获比较寄存器的值						
						GPIO_ResetBits(GPIOC,GPIO_Pin_13);		//小灯快闪两次,标志key1按下						 
						delay_ms(100);
				   		GPIO_SetBits(GPIOC,GPIO_Pin_13);						 
						delay_ms(100);
						GPIO_ResetBits(GPIOC,GPIO_Pin_13);						 
						delay_ms(100);
				    	GPIO_SetBits(GPIOC,GPIO_Pin_13);									
						break;
				case KEY0:	
						TIM_SetCompare2(TIM3,2003);          //2000us
						GPIO_ResetBits(GPIOC,GPIO_Pin_13);	  //小灯常量	,key0按下				 
						break;
			}
		}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

以上两组代码的区别仅仅在于**函数TIM_SetCompare2(TIMx,ccr)**中 ccr(捕获比较寄存器的值不同)

在这里插入图片描述
在WM初始化函数中可定义:
PWM1模式:当CNT计数器的值<捕获比较寄存器的值时,PWM输出有效电平。
高电平有效:有效电平为高电平。
PWM2模式:当CNT计数器的值>捕获比较寄存器的值时,PWM输出有效电平。
低电平有效:有效电平为低电平。

以下时在下学习pwm初始化时常看的几张图:请添加图片描述
请添加图片描述
请添加图片描述
上图中TIM_Pulse=ccr捕获比较寄存器的值

请添加图片描述
  先说TIM_ARRPreloadConfig设置为DISABLE 和ENABLE的问题,他的作用只是允许或禁止在定时器工作时向ARR的缓冲器中写入新值,以便在更新事件发生时载入覆盖以前的值。在开始初始化的时候你已经把" TIM_TimeBaseStructure.TIM_Period=2000; //ARR的值 ",后来也一直是这个值,原因是你没有编写中断服务函数或者你在中断服务函数中根本就没有给ARR缓冲器重新写入新值,所以设置为DISABLE 和ENABLE都没有影响。

那么如果后来也一直是这个值,不写入新值的话,这句话是不是就可以不用写了,我觉得可以不用写。
原文链接:https://blog.csdn.net/jpaekeo/article/details/64906477请添加图片描述
请添加图片描述
仓促结束,如有问题,欢迎留言。如果对你有帮助,给咱个赞好吗,老师儿~~~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/893120
推荐阅读
相关标签
  

闽ICP备14008679号