微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 玩了一学期,我终于要开始做自己的自平衡小车了,望大神进来指正啊

玩了一学期,我终于要开始做自己的自平衡小车了,望大神进来指正啊

时间:10-02 整理:3721RD 点击:

今天开始放寒假,打算留校一段时间做小车项目作为拖延症患者,今天买了一些装备
42步进电机、A4988驱动板、底座、杜邦线、铜柱螺丝什么的、还有我的STM32最小系统板
不知道还要买些什么。
先这样吧。
货大概还要3、4天才能到吧。
先复习一下STM32好了[qq]1163151703[/qq]
据说20号要下雪了,感觉要被困在学校了。
今天拿THB6128驱动板试玩了一下,写了一段PWM波输出程序,步进电机也借了一个
程序下好后发现,给驱动板供电的电源找不到了。哭晕在厕所。
只能等小伙伴帮我找找了,不知道还有什么电源可以用作驱动电源啊?
程序也不知道对不对了,先上传看看吧==

  1. #include "stm32f10x.h"                  // Device header
  2. #include "delay.h"

  3. void TIM1_PWM_Init(u16 arr,u16 psc)
  4. {  
  5.         GPIO_InitTypeDef GPIO_InitStructure;
  6.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  7.         TIM_OCInitTypeDef  TIM_OCInitStructure;

  8.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
  9.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);  //使能GPIO外设时钟使能
  10.                                                                                     

  11. //设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形
  12.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM_CH1
  13.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
  14.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  15.         GPIO_Init(GPIOA, &GPIO_InitStructure);

  16. //定时器设置
  17.         TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         80K
  18.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频
  19.         TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  20.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  21.         TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

  22. //PWM输出通道设置
  23.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
  24.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  25.         TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
  26.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  27.         TIM_OC1Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

  28.     TIM_CtrlPWMOutputs(TIM1,ENABLE);        //MOE 主输出使能        

  29.         TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH1预装载使能         
  30.         
  31.         TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器
  32.         
  33.         TIM_Cmd(TIM1, ENABLE);  //使能TIM1

  34.    
  35. }

  36. int main(void)
  37. {        
  38.         u16 led0pwmval=300;   //PWM脉宽比较值
  39.         u8 dir=1;        
  40.         delay_init();                     //延时函数初始化         
  41.         TIM1_PWM_Init(899,0);//不分频。PWM频率=72000/(899+1)=80Khz 实际上是缩小了频率
  42.            while(1)
  43.         {
  44.                
  45.              delay_ms(10);         
  46.              if(dir)led0pwmval++;
  47.                 else led0pwmval--;         
  48.                  if(led0pwmval>300)dir=0;
  49.                 if(led0pwmval==0)dir=1;                           
  50.                 TIM_SetCompare1(TIM1,led0pwmval);               
  51.         }
  52. }

复制代码

好吧,上面那个程序好像不怎么样,于是同学帮忙给了我另一个程序但是电机以龟速旋转
是电压不够的原因吗?代码如下

  1. #include "led.h"
  2. #include "delay.h"
  3. #include "sys.h"
  4. #include "pwm.h"
  5. #include "key.h"


  6. /**********************************************************************
  7. 步进电机:固有步距脚 1.8°
  8. 细分数:X。
  9. 步距脚 = 固有步距脚 / 细分数  (1.8 / x)
  10. 1.设定时间:一个脉冲时间为1ms(pwm分频  下面程序为  72000000/((71+1)*(999+1))=1khz 计数1000为一个时钟脉冲,即为1ms
  11. 假定 x = 4,步距脚 = 1.8°/4 = 0.45° 转360° 即360/0.45 = 800脉冲
  12. 延时800ms相当于给800个时钟脉冲为:0.45*(800/1) = 360°
  13. 2.设定时间:一个脉冲时间为0.9ms(自行设定)
  14. x = 4  步距脚 = 0.45°,转360° 即360/0.45 = 800脉冲
  15. 延时720ms相当于给720个时钟脉冲   0.45*(720/0.9) = 360°

  16. ***********************************************************************/

  17. int main(void)
  18. {       
  19.         u16 led0pwmval=0;   
  20. //        u8 dir=1;       
  21. //         u8 t ;
  22.          u16 i,t;
  23.          u16 s;
  24.         delay_init();                     //延时函数初始化          
  25.         LED_Init();                          //初始化与LED连接的硬件接口
  26.         KEY_Init();
  27.          LED0=1;
  28.          LED1=1;
  29. //        TIM2_PWM_Init(999,71);//不分频。PWM频率=72000/(899+1)=80Khz
  30.    
  31.          while(1)
  32.                 {  
  33.                        
  34. //                       
  35. //                       
  36.                        
  37. ////                        delay_ms(500);                       
  38. ////                }            //原因在这里   任何一个main要有一个while(1);不然程序执行时会出现错误。
  39. //        TIM2_PWM_Init(s,71);//不分频。PWM频率=72000/(899+1)=80Khz
  40. ////                       
  41. ////       while(1)        //用来终止程序的
  42. ////                         {
  43. ////                               
  44. ////                         ;         
  45. ////                       
  46. ////        }
  47.                        
  48.                            t=KEY_Scan(0);
  49.                        
  50.         for(s=1100;s>500;s--)      //控制步进电子的加速
  51.                                 {
  52.                                         TIM2_PWM_Init(s,71);      //步进电机的范围为72000/1101*72kHz~72000/501*72kHz
  53.                                         TIM_SetCompare2(TIM2,450);
  54.                                         delay_ms(100);
  55.                                         LED0=!LED0;
  56.                                 }
  57.                                   LED0=1;
  58.                                
  59.                        
  60.                        
  61.                                
  62.                                
  63.                                   TIM_SetCompare2(TIM2,0);   //控制步进电机停止
  64.                                   delay_ms(1000);
  65.                                   delay_ms(1000);
  66.                                   TIM2_PWM_Init(999,71);     //设置步进电机的频率为72000/1000*72kHz
  67.                                         TIM_SetCompare2(TIM2,450);
  68.                                         delay_ms(1200);
  69.                                   delay_ms(1200);
  70.                                   TIM_SetCompare2(TIM2,0);
  71.                                   delay_ms(1000);
  72.                                   delay_ms(1000);
  73.                                
  74.        for(s=500;s<1100;s++)      //控制步进电子的减速
  75.                                 {
  76.                                         TIM2_PWM_Init(s,71);
  77.                                         TIM_SetCompare2(TIM2,450);
  78.                                         delay_ms(100);
  79.                                         LED1=!LED1;
  80.         }
  81.                                   LED1=0;


  82.                                   TIM_SetCompare2(TIM2,0);   //控制步进电机停止
  83.                                   delay_ms(1000);
  84.                                   delay_ms(1000);
  85.                                   TIM2_PWM_Init(599,71);
  86.                                  for(i=0;i<10;i++)         //控制步进电机以频率为72000/600*72kHz转10s
  87.                                 {
  88.           TIM_SetCompare2(TIM2,450);
  89.                                         delay_ms(1000);
  90.                                         LED0=!LED0;
  91.                                         LED1=!LED1;
  92.                                 }
  93.                                   TIM_SetCompare2(TIM2,0);   //控制步进电机停止
  94.                                   delay_ms(1000);
  95.                                   delay_ms(1000);
  96.                                

  97.                     }
  98.                        
  99. }
  100. #include "pwm.h"
  101. #include "led.h"
  102. //////////////////////////////////////////////////////////////////////////////////         



  103. //PWM输出初始化
  104. //arr:自动重装值
  105. //psc:时钟预分频数
  106. void TIM2_PWM_Init(u16 arr,u16 psc)
  107. {  
  108.          GPIO_InitTypeDef GPIO_InitStructure;
  109.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  110.         TIM_OCInitTypeDef  TIM_OCInitStructure;

  111.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//
  112.        

  113.        
  114. //          RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//开启AFIO时钟
  115. //                GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);// 改变指定管脚的映射 GPIO_Remap_SWJ_Disable SWJ 完全禁用(JTAG+SW-DP)
  116. //                GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);// 改变指定管脚的映射 GPIO_Remap_SWJ_JTAGDisable ,JTAG-DP 禁用 + SW-DP 使能
  117.        
  118.        
  119.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC , ENABLE);  //使能GPIO外设时钟使能
  120.                                                                                     

  121.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4; //
  122.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
  123.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  124.         GPIO_Init(GPIOC, &GPIO_InitStructure);
  125. //        GPIO_SetBits(GPIOC,  GPIO_Pin_3 | GPIO_Pin_4);

  126.        
  127.        
  128. //        GPIO_SetBits(GPIOB,  GPIO_Pin_3 | GPIO_Pin_4);
  129.        
  130.    //设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形
  131.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //TIM_CH4
  132.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
  133.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  134.         GPIO_Init(GPIOA, &GPIO_InitStructure);

  135.        
  136.         TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         80K
  137.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频
  138.         TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  139.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  140.         TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位


  141.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
  142.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  143.         TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
  144.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  145.         TIM_OC2Init(TIM2, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

  146.   TIM_CtrlPWMOutputs(TIM2,ENABLE);        //MOE 主输出使能       

  147.         TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);  //CH1预装载使能         
  148.        
  149.         TIM_ARRPreloadConfig(TIM2, ENABLE); //使能TIMx在ARR上的预装载寄存器
  150.        
  151.         TIM_Cmd(TIM2, ENABLE);  //使能TIM1

  152.    
  153. }

复制代码

感觉前路漫漫啊

支持

加油,坚持做下去

没有加速度传感器?

项目里需要用到,但是还没买,一步一步来吧

问一下,这个要用到罗盘吗?

罗盘?我只会用到陀螺仪,加速度器和蓝牙吧

进展如何,我卡在pid调节上了, 步进电机无惯性,轴可锁定,我的小车现在只能稳稳的站着,pid调的很小,一碰就倒,pid怎么调都不行,调大一点就倒了。希望共同探讨一下

加油,坚持做下去

继续加油哦,

支持!1

加油加油加油加油加油

你的进度比我快,开学了空闲时间少了,但是我想请教一下你电机驱动板用的什么,我用的那个很不好用,感觉被店家坑了,谢谢ヾ(●′▽`●)ノ

阿西吧!最近想到这个没做完的小车就好方!
我之前买的驱动一点都不稳定,整个人都不好了,网上大多是直流电,〒_〒,表示很难过,现在想重新买个驱动,但是不知道用什么好=_=

谢谢分享

感觉好多!

谢谢分享

谢谢分享谢谢分享谢谢分享
       谢谢分享谢谢分享                       谢谢分享
       谢谢分享谢谢分享                谢谢分享         
                   谢谢分享              谢谢分享谢谢分享谢谢分享
             谢谢分享              谢谢分享        谢                谢
             谢谢分享              谢谢分享        谢                谢
             谢谢分享              谢谢分享        分                分
             谢谢分享              谢谢分享        享                享
             谢谢分享              谢谢分享        谢                谢
             谢谢分享              谢谢分享        谢                谢
谢        谢谢分享               谢谢分享       分                分
谢谢     谢谢分享              谢谢分享        享                享
谢谢分 谢谢分享              谢谢分享        谢                谢
谢谢分 谢谢分享                               谢       谢
谢谢分谢谢分享                         谢                 谢
         谢谢谢谢                    分                               分
             谢谢                   享                                     享

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top