[求助] pwm 无刷电调 N5065电机

liuw2010   2016-6-28 21:53 楼主
买了一个fvt无刷电调,一个N5065电机,用STM32的PWM驱动。
按说明书中设置油门行程:
***************************************
首先关闭电调开关,连接电池,再打开您的车用发射机电源,将油门通道方向设置为(REV),油门微调设置为(0),油门通
道的 EPA/ATV 正反向均设置为最大,油门在自然位。
按下 SET 键不松开,将电调开关打到 ON 位,等待 1 秒左右,电调红色 LED 闪烁并且马达发出‘滴.滴’的连续响声,这时把
SET 键松开,同时把发射机油门拉杆置自然位后按一下 SET 键会听到马达‘滴’的一声响,再把您的发射机油门拉杆拉最大
后并且按一下 SET 键会听到马达‘滴滴’的二声响,再把油门拉杆推到最小后并且按一下 SET 键会听到马达‘滴滴滴’的三
声响,红色 LED 、 绿色 LED 同时灭掉,马达滴滴滴三声响后,表示油门行程设定 OK,2 秒后开始进入电池节数检测模式。
************************************************
*号之间的为说明书中内容。


我的思路:
用PWM产生50HZ频率,通过改变占空比从而改变高电平时间。
TIM3_PWM_Init(799,1800);//PWM频率为(72000000/1800/800=50HZ)。
占空比的理解:
TIM3_PWM_Init中799,则x/800就是占空比,其中x为TIM_SetCompare2(TIM3,x);中第二个变量
网上查资料说电调最高油门为2.1ms,最低油门为0.9ms,中间油门为1.5ms,分别对应设置占空比函数:
TIM_SetCompare2(TIM3,84);
TIM_SetCompare2(TIM3,36);
TIM_SetCompare2(TIM3,60);
我在程序中这样设置:
初始化时TIM_SetCompare2(TIM3,60);即对应说明书中油门自然位。
然后有一个触发中断的按键,第一次按键后,TIM_SetCompare2(TIM3,60)中第二个参数从60逐渐增加到84(对应说明书中最大油门),第二次按键时从84减小到36,即对应说明书中最小油门。
这个过程中按说明书中顺序按set键,但是在按键调到最大油门和最小油门时都没有听到‘滴滴’的二声响和‘滴滴滴’的三声响,说明设置行程没有成功。


/*
jishu初始化为0,第一次按键,变为1,再按键变为2。
*/



int main(void)
{  
  u16 led0pwmval=0;
u8 dir=1;
u8 flag=0;
u8 flag2=0;
u8 flag3=0;
u8 flag4=0;
led0pwmval=36;
delay_init();       //延时函数初始化   
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(9600);  //串口初始化为115200
  LED_Init();        //LED端口初始化
KEY_Init();          //初始化与按键连接的硬件接口
TIM3_Int_Init(799,1800);
EXTIX_Init();    //外部中断初始化
LED1=0;
  TIM3_PWM_Init(799,1800);//PWM频率为(72000000/1800/800=50HZ)
TIM_SetCompare2(TIM3,60);
USART_SendData(USART3,0x55);

while(1)
{
  if(jishu==1)//高60-84
  {   
   if(flag2==0)
   {
    while(1)
    {
     if(flag_20ms==1)
     {
      flag_20ms=0;
      if(led0pwmval<84)led0pwmval++;
      TIM_SetCompare2(TIM3,led0pwmval);
      if(led0pwmval==84)
      {
       flag2=1;
       USART_SendData(USART3,jishu);
       break;
      }
     }  
    }
   }
  }
  if(jishu==2)//低84-36
  {  
   if(flag3==0)
   {
    while(1)
    {
     if(flag_20ms==1)
     {
      flag_20ms=0;
      if(led0pwmval>36)led0pwmval--;
      TIM_SetCompare2(TIM3,led0pwmval);
      if(led0pwmval==36)
      {
       flag3=1;
       USART_SendData(USART3,jishu);
       break;
      }
     }
    }
   }
  }
}
}

回复评论 (1)

"CodeForge的这个代码或许可以解答你的问题http://www.codeforge.cn/article/291064
点赞  2016-7-21 20:58
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复