• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

问题关于STM32驱动MG995舵机,请大神指点,纠结好长时间了,不知道问题出在哪?

dadaxiu 2018-06-12 浏览量:1537
TIM1_PWM_Init(4999,287);//50hz
         while(1)
         {
                 
                 delay_ms(100);
                 if(dir) t=t+20;
                 else t=t-20;
                 if(t>660)dir=0;
                 if(t==140)dir=1;
//                 printf("t:%d\n",t);
                  TIM_SetCompare1(TIM1,t);
         }
}         这段程序还能使舵来回转,pwm波形正确

但这段程序用示波器检测pwn都没有,舵机不动,用串口打印调试如图所示
while(1)
                 {
                         delay_ms(100);
                         dianpin= GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1);//红外检测是否有人,有人输出高电平
                        printf("%d\n",dianpin);用串口调试,观看对着人与不对着人的电平高低变化
                         if(!dianpin)//没检测到人,让舵机转动检测
                         {
                         delay_ms(20000);
                                 
                         if(dir) t=t+20;
                         else t=t-20;
                         if(t>660) dir=0;        
                         if(t==140)dir=1;               
                        TIM_SetCompare1(TIM1,t);
                        }
                          else//检测到人,舵机在原来的位置停止
                                {
                                delay_ms(1000);
                                TIM_SetCompare1(TIM1,t);
                                }
                                 printf("t:%d\n ",t); //用串口调试观察t的值
                                }         
}
不对着人,串口打印如图所示                                对着人打印如下:
                                             
请大家帮忙!
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 这么说吧,如果你的上面一段程序没问题,下面这段应该正常输出PWM。

    而且看你的串口输出整体逻辑没问题。

    建议你插上仿真器,看看执行TIM_Setcompare之后定时器CCR寄存器的值有没有改变。

    看看其他配置寄存器内容对不对。

    • 发布于 2018-06-12
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:7
  • 逻辑上没看出有什么问题。

    所以,先试一下这样改,找找是哪句话出问题了。

    把dianpin= GPIO_ReadInputDataBit(GPIOAGPIO_Pin_1);

    改成dianpin= 0;


    • 发布于2018-06-12
    • 举报
    • 评论 0
    • 0
    • 0

  • 这个需要检查一下你的检测人在不在时间是不是刷新太快,导致的PWM还没数据就把他关闭了
    • 发布于2018-06-12
    • 举报
    • 评论 0
    • 0
    • 0

  • 你可以拿万用表测试PA1脚在没有人时候是不是为低电平,如果是为电平时候舵机如果还是不转 你看看你舵机和开发板是不是分开供电  因为舵机工作可能就导致芯片不能够得到正常电压 如果是单独供电的话 看看两者有没有共地
    • 发布于2018-06-12
    • 举报
    • 评论 0
    • 0
    • 0

  • 这个要看看是不是检测的那个IO配置和PWM初始化有冲突
    • 发布于2018-06-12
    • 举报
    • 评论 0
    • 0
    • 0

  • 老实说这个周期已经很大了,不确定是不是你的示波器没有测出来。这种时序问题还是用逻辑分析仪吧。我一时间也没有从程序里面发现什么,只能猜测是不是在初始化之后又在哪里又改了。不过看楼主那段新的程序打印出来的t值也依然有变化,这种情况下不转,是不是因为TIM_SetCompare1里面有什么特殊的设置?
    • 发布于2018-06-12
    • 举报
    • 评论 0
    • 0
    • 0

  • 检测不到人的时候的延时是20000毫秒,也就是20秒,太长时间了吧,由于无法确定这个Delay是不是busy waiting的函数,如果是的话,单片机在这段时间内啥都做不了一直在延时。

    • 发布于2018-06-12
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

问题关于STM32驱动MG995舵机,请大神指点,纠结好长时间了,不知道问题出在哪?