打印
[信息]

写了一个智能小车程序 舵机反应老不对 教一下..

[复制链接]
1345|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
哆啦吼|  楼主 | 2016-5-15 01:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<pbdata.h>

void RCC_Configuration(void);
void GPIO_Configuration(void);
void TIM4_Configuration(void);
void TIM3_Configuration(void);

int main(void)
{
  
         
   RCC_Configuration();        //ϵͳʱÖÓ³õʼ»¯
   GPIO_Configuration();//¶Ë¿Ú³õʼ»¯
   TIM3_Configuration();//¶¨Ê±Æ÷ºÍpwmÅäÖÃ
         TIM4_Configuration();
   TIM_Cmd(TIM3,ENABLE);     //¶¨Ê±Æ÷¿ªÊ¼
         TIM_Cmd(TIM4,ENABLE);     
        // TIM_SetCompare3(TIM3,pwm);   //PB0
         //TIM_SetCompare3(TIM4,left);  //PB8
         //TIM_SetCompare4(TIM4,right); //PB9
         GPIO_SetBits(GPIOB,GPIO_Pin_7);//×óµç»úÕý·´×ª¿ØÖÆλ  PB1 PB7 Êä³ö
         GPIO_ResetBits(GPIOB,GPIO_Pin_1);
         GPIO_SetBits(GPIOA,GPIO_Pin_7);//ÓÒµç»úÕý·´×ª¿ØÖÆλ PA7 PA6 Êä³ö
         GPIO_ResetBits(GPIOA,GPIO_Pin_6);
                
       
        while(1)
        {
             
                         if(zuo1==1&&zuo2==1&&zuo3==1&&you4==1&&you5==1&&you6==1)
                         {
                             
                                                 Forward();
                         }
                         else if(zuo1==0&&zuo2==1&&zuo3==1)
                         {
                             
                          RightturnLow();
                         }
                         else if(zuo1==0&&zuo2==0&&zuo3==1)
                         {
                               RightturnZhong();
                         }
                         else if(zuo1==1&&zuo2==0&&zuo3==1)
                         {
                               RightturnZhongs();
                         }
                         else if(zuo1==1&&zuo2==1&&zuo3==0)
                         {
                              RightturnHigh();
                         }
                         else if(you6==0&&you5==1&&you4==1)
                         {
                              LeftturnLow();
                         }
                         else if(you6==0&&you5==0&&you4==1)
                         {
                              LeftturnZhong();
                         }
                         else if(you6==1&&you5==0&&you4==1)
                         {
                              LeftturnZhongs();
                         }
                         else if(you6==1&&you5==1&&you4==0)
                         {
                               LeftturnHigh();
                                       
                         }
                         else if(zuo1==0&&zuo2==0&&zuo3==0&&you4==0&&you5==0&&you6==0)
                         {
                             
                                        TIM_SetCompare3(TIM3,140);
                                        GPIO_ResetBits(GPIOB,GPIO_Pin_7);//×óµç»úÕý·´×ª¿ØÖÆλ  PB1 PB7 Êä³ö
               GPIO_ResetBits(GPIOB,GPIO_Pin_1);
               GPIO_ResetBits(GPIOA,GPIO_Pin_7);//ÓÒµç»úÕý·´×ª¿ØÖÆλ PA7 PA6 Êä³ö
                GPIO_ResetBits(GPIOA,GPIO_Pin_6);
                         }
        }

}
void RCC_Configuration(void)
{
     SystemInit();
                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
                 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
                 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
}
void GPIO_Configuration(void)
{
     GPIO_InitTypeDef GPIO_InitStructure;
                 //PWM  ÓÒµç»úPB9/TIM4_CH4   ×óµç»úPB8/TIM4_CH3   ¶æ»úPB0/TIM3_CH3
                 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_0;
                 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
                 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;  //¸´ÓÃÍÆÍìÊä³ö   PWM
                 GPIO_Init(GPIOB,&GPIO_InitStructure);
                 
                 // PB3 PB4  PB5  ÊäÈë
                 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
                 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;  //¸¡¿ÕÊäÈë
                 GPIO_Init(GPIOB,&GPIO_InitStructure);
               
                //PA1  PA2  PA3  ÊäÈë
                 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
                 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;  //¸¡¿ÕÊäÈë
                 GPIO_Init(GPIOA,&GPIO_InitStructure);
                 
                 //×óµç»úÕý·´×ª¿ØÖÆλ  PB1 PB7 Êä³ö
                 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1 | GPIO_Pin_7;
                 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
                 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;  
                 GPIO_Init(GPIOB,&GPIO_InitStructure);
                 
                 //ÓÒµç»úÕý·´×ª¿ØÖÆλ PA7 PA6 Êä³ö
                 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7 | GPIO_Pin_6;
                 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
                 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;  
                 GPIO_Init(GPIOA,&GPIO_InitStructure);
                 
}
void TIM3_Configuration(void)
{
     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
                 TIM_OCInitTypeDef TIM_OCInitStructure; //PWM
                 
                //¶¨Ê±Æ÷
                 TIM_TimeBaseStructure.TIM_Period =2000-1;//³õÖµ   Period¼ÈÊÇÉèÖÃTIMx ARRµÄÖµ  Ò²ºÍPrescaler¹²Í¬È·¶¨pwmµÄƵÂÊ  ¸Ä±äPeriod¿ÉÒԸıäÕ¼¿Õ±È¾«¶È
     TIM_TimeBaseStructure.TIM_Prescaler =720-1 ;//Ô¤·ÖƵ
     TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
                 
                 //PWM  ¶æ»ú  PB0/TIM3_CH3
                 TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
                 TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//Êä³öʹÄÜλ
                 TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
                 TIM_OC3Init(TIM3,&TIM_OCInitStructure);
                 TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);//ʹÄÜԤװÔؼĴæÆ÷
}
void TIM4_Configuration(void)
{
     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
                 TIM_OCInitTypeDef TIM_OCInitStructure; //PWM
                 
                //¶¨Ê±Æ÷
                 TIM_TimeBaseStructure.TIM_Period =100-1;//³õÖµ   ¡PPeriod¼ÈÊÇÉèÖÃTIMx ARRµÄÖµ  ¼´ÓÃÀ´ÉèÖÃpwmµÄƵÂÊ
     TIM_TimeBaseStructure.TIM_Prescaler =72-1 ;//Ô¤·ÖƵ
     TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
     TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
                 
          
                 
                 //PWM ÓÒµç»ú  PB9/TIM4_CH4
                 TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
                 TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//Êä³öʹÄÜλ
                 TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
                 TIM_OC4Init(TIM4,&TIM_OCInitStructure);
                 TIM_OC4PreloadConfig(TIM4,TIM_OCPreload_Enable);//ʹÄÜԤװÔؼĴæÆ÷
                 
                 //PWM ×óµç»ú  PB8/TIM4_CH3
                 TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
                 TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//Êä³öʹÄÜλ
                 TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
                 TIM_OC3Init(TIM4,&TIM_OCInitStructure);
                 TIM_OC3PreloadConfig(TIM4,TIM_OCPreload_Enable);//ʹÄÜԤװÔؼĴæÆ÷
                                  
               
               
}


沙发
哆啦吼|  楼主 | 2016-5-15 01:43 | 只看该作者
#define _DRIVER_C
#include"pbdata.h"

void Forward(void)
{
     TIM_SetCompare3(TIM3,135);  //¶æ»ú
           TIM_SetCompare3(TIM4,60);  //×óËÙ¶È
           TIM_SetCompare4(TIM4,60);  //ÓÒËÙ¶È
                GPIO_SetBits(GPIOB,GPIO_Pin_1);//×óµç»úÕý·´×ª¿ØÖÆλ  PB1 PB7 Êä³ö
         GPIO_ResetBits(GPIOB,GPIO_Pin_7);
         GPIO_SetBits(GPIOA,GPIO_Pin_6);//ÓÒµç»úÕý·´×ª¿ØÖÆλ PA7 PA6 Êä³ö
         GPIO_ResetBits(GPIOA,GPIO_Pin_7);
}
void RightturnLow(void)
{
     TIM_SetCompare3(TIM3,140);   
           TIM_SetCompare3(TIM4,55);  
           TIM_SetCompare4(TIM4,55);
                 GPIO_SetBits(GPIOB,GPIO_Pin_7);//×óµç»úÕý·´×ª¿ØÖÆλ  PB1 PB7 Êä³ö
         GPIO_ResetBits(GPIOB,GPIO_Pin_1);
         GPIO_SetBits(GPIOA,GPIO_Pin_7);//ÓÒµç»úÕý·´×ª¿ØÖÆλ PA7 PA6 Êä³ö
         GPIO_ResetBits(GPIOA,GPIO_Pin_6);
}                 
void RightturnZhong(void)
{
     TIM_SetCompare3(TIM3,145);   
           TIM_SetCompare3(TIM4,50);  
           TIM_SetCompare4(TIM4,50);
                 GPIO_SetBits(GPIOB,GPIO_Pin_7);//×óµç»úÕý·´×ª¿ØÖÆλ  PB1 PB7 Êä³ö
         GPIO_ResetBits(GPIOB,GPIO_Pin_1);
         GPIO_SetBits(GPIOA,GPIO_Pin_7);//ÓÒµç»úÕý·´×ª¿ØÖÆλ PA7 PA6 Êä³ö
         GPIO_ResetBits(GPIOA,GPIO_Pin_6);
                 
}
void RightturnZhongs(void)
{
     TIM_SetCompare3(TIM3,150);   
           TIM_SetCompare3(TIM4,45);  
           TIM_SetCompare4(TIM4,45);
                 GPIO_SetBits(GPIOB,GPIO_Pin_7);//×óµç»úÕý·´×ª¿ØÖÆλ  PB1 PB7 Êä³ö
         GPIO_ResetBits(GPIOB,GPIO_Pin_1);
         GPIO_SetBits(GPIOA,GPIO_Pin_7);//ÓÒµç»úÕý·´×ª¿ØÖÆλ PA7 PA6 Êä³ö
         GPIO_ResetBits(GPIOA,GPIO_Pin_6);
}
void RightturnHigh(void)
{
     TIM_SetCompare3(TIM3,155);   
           TIM_SetCompare3(TIM4,45);  
           TIM_SetCompare4(TIM4,35);
                 GPIO_SetBits(GPIOB,GPIO_Pin_7);//×óµç»úÕý·´×ª¿ØÖÆλ  PB1 PB7 Êä³ö
         GPIO_ResetBits(GPIOB,GPIO_Pin_1);
         GPIO_SetBits(GPIOA,GPIO_Pin_7);//ÓÒµç»úÕý·´×ª¿ØÖÆλ PA7 PA6 Êä³ö
         GPIO_ResetBits(GPIOA,GPIO_Pin_6);
}
void LeftturnLow(void)
{
     TIM_SetCompare3(TIM3,130);   
           TIM_SetCompare3(TIM4,55);  
           TIM_SetCompare4(TIM4,55);
                GPIO_SetBits(GPIOB,GPIO_Pin_7);//×óµç»úÕý·´×ª¿ØÖÆλ  PB1 PB7 Êä³ö
         GPIO_ResetBits(GPIOB,GPIO_Pin_1);
         GPIO_SetBits(GPIOA,GPIO_Pin_7);//ÓÒµç»úÕý·´×ª¿ØÖÆλ PA7 PA6 Êä³ö
         GPIO_ResetBits(GPIOA,GPIO_Pin_6);
}
void LeftturnZhong(void)
{
     TIM_SetCompare3(TIM3,125);   
           TIM_SetCompare3(TIM4,50);  
           TIM_SetCompare4(TIM4,50);
                 GPIO_SetBits(GPIOB,GPIO_Pin_7);//×óµç»úÕý·´×ª¿ØÖÆλ  PB1 PB7 Êä³ö
         GPIO_ResetBits(GPIOB,GPIO_Pin_1);
         GPIO_SetBits(GPIOA,GPIO_Pin_7);//ÓÒµç»úÕý·´×ª¿ØÖÆλ PA7 PA6 Êä³ö
         GPIO_ResetBits(GPIOA,GPIO_Pin_6);
}               
void LeftturnZhongs(void)
{
     TIM_SetCompare3(TIM3,120);   
           TIM_SetCompare3(TIM4,45);  
           TIM_SetCompare4(TIM4,45);
                 GPIO_SetBits(GPIOB,GPIO_Pin_7);//×óµç»úÕý·´×ª¿ØÖÆλ  PB1 PB7 Êä³ö
         GPIO_ResetBits(GPIOB,GPIO_Pin_1);
         GPIO_SetBits(GPIOA,GPIO_Pin_7);//ÓÒµç»úÕý·´×ª¿ØÖÆλ PA7 PA6 Êä³ö
         GPIO_ResetBits(GPIOA,GPIO_Pin_6);
               
}
void LeftturnHigh(void)
{
     TIM_SetCompare3(TIM3,115);   
           TIM_SetCompare3(TIM4,35);  
           TIM_SetCompare4(TIM4,45);
                 GPIO_SetBits(GPIOB,GPIO_Pin_7);//×óµç»úÕý·´×ª¿ØÖÆλ  PB1 PB7 Êä³ö
         GPIO_ResetBits(GPIOB,GPIO_Pin_1);
         GPIO_SetBits(GPIOA,GPIO_Pin_7);//ÓÒµç»úÕý·´×ª¿ØÖÆλ PA7 PA6 Êä³ö
         GPIO_ResetBits(GPIOA,GPIO_Pin_6);
}

使用特权

评论回复
板凳
mmuuss586| | 2016-5-15 11:13 | 只看该作者

不写个简单的说明,怎么看的明白呢;
哪里不对呢?具体有什么反应,工作原理是啥

使用特权

评论回复
地板
哆啦吼|  楼主 | 2016-5-15 15:57 | 只看该作者
mmuuss586 发表于 2016-5-15 11:13
不写个简单的说明,怎么看的明白呢;
哪里不对呢?具体有什么反应,工作原理是啥 ...

车是利用红外对管做的寻迹小车  用的是stm32c8t6  ,用了两个定时器,  3个pwm , 红外对管接在单片机上 io模式是浮空输入 。  我单独测舵机时 给它16ms的脉宽它居中,  在整个程序中 当检测到所有灯都亮时给它16ms脉宽  结果舵机往左打  并且舵机还有时抖。  我写的是在大循环中检测 我写的8种情况  ,  当一种情况发生时 就执行下面的语句,这些语句都是 改变3个pwm的占空比,例如TIM_SetCompare3(TIM3,135);  TIM_SetCompare3(TIM4,60);  TIM_SetCompare4(TIM4,60);  但是车子就是不稳定,是不是32检测速度太快?  是不是要加写延时,逻辑分析仪的波形都对  我真的不知道怎么回事....

使用特权

评论回复
5
哆啦吼|  楼主 | 2016-5-15 16:26 | 只看该作者
mmuuss586 发表于 2016-5-15 11:13
不写个简单的说明,怎么看的明白呢;
哪里不对呢?具体有什么反应,工作原理是啥 ...

总共用了6个红外对管  从左到右编号为zuo1 zuo2 zuo3 you4   you5  you6    分为一下几种情况  if(zuo1==1&&zuo2==1&&zuo3==1&&you4==1&&you5==1&&you6==1)
                          {
                              
                                                  Forward();
                          }
                          else if(zuo1==0&&zuo2==1&&zuo3==1)
                          {
                              
                           RightturnLow();
                          }
                          else if(zuo1==0&&zuo2==0&&zuo3==1)
                          {
                                RightturnZhong();
                          }
                          else if(zuo1==1&&zuo2==0&&zuo3==1)
                          {
                                RightturnZhongs();
                          }
                          else if(zuo1==1&&zuo2==1&&zuo3==0)
                          {
                               RightturnHigh();
                          }
                          else if(you6==0&&you5==1&&you4==1)
                          {
                               LeftturnLow();
                          }
                          else if(you6==0&&you5==0&&you4==1)
                          {
                               LeftturnZhong();
                          }
                          else if(you6==1&&you5==0&&you4==1)
                          {
                               LeftturnZhongs();
                          }
                          else if(you6==1&&you5==1&&you4==0)
                          {
                                LeftturnHigh();
                                         
                          }
                          else if(zuo1==0&&zuo2==0&&zuo3==0&&you4==0&&you5==0&&you6==0)
                          {
                              
                                   stop()                          }  这是后舵机不正常  但当我分为3种情况 if(zuo1==1&you6==1)
                         {
                              TIM_SetCompare3(TIM3,0x87);
                                                 //Forward();
                         }
                          else if(zuo1==0)
                         {
                             
                        TIM_SetCompare3(TIM3,0xa0);   //PB0
          
                         }
                          else if(you6==0)
                         {
                              TIM_SetCompare3(TIM3,0x6e);
                         }舵机正常

使用特权

评论回复
6
哆啦吼|  楼主 | 2016-5-15 16:30 | 只看该作者
mmuuss586 发表于 2016-5-15 11:13
不写个简单的说明,怎么看的明白呢;
哪里不对呢?具体有什么反应,工作原理是啥 ...

还有TIM_SetCompare3(TIM3,0x6e);  的后面的那个数是写成16进制数 还是10进制数好   3种情况的时候我用的是16进制数   多种情况时我用的是10进制数 这个会出问题吗?

使用特权

评论回复
7
949155525| | 2016-5-15 20:45 | 只看该作者
最烦贴代码的了

使用特权

评论回复
8
lovecat2015| | 2016-5-15 22:34 | 只看该作者
你的舵机现在有驱动电路吗?只给高低电平能驱动吗?

使用特权

评论回复
9
奥卡姆剃刀| | 2016-5-16 09:21 | 只看该作者
顶一个!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

31

帖子

1

粉丝