野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10731|回复: 23

【李超大神,此贴置为精华,方框内的字由fire添加】火哥赞助的平衡车,持续更新。

[复制链接]
发表于 2016-9-12 10:30:58 | 显示全部楼层 |阅读模式

都打开

都打开
一个充电器一个平衡车

平衡车侧面

平衡车侧面

平衡车侧面

平衡车顶面

平衡车顶面

平衡车顶面可以看到蓝牙,OLED 板子等等,张工做的layout

刚打开是这样的

刚打开是这样的




刚开始打开的时候
回复

使用道具 举报

 楼主| 发表于 2016-9-12 10:38:14 | 显示全部楼层
开工了。 争取早点解决平衡问题,电机速度差问题
回复 支持 反对

使用道具 举报

发表于 2016-9-12 10:45:58 来自手机 | 显示全部楼层
challee 发表于 2016-9-12 10:38
开工了。 争取早点解决平衡问题,电机速度差问题

已经烧写好历程的了,上电,按k3就可以平衡。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-12 11:04:37 | 显示全部楼层
fire 发表于 2016-9-12 10:45
已经烧写好历程的了,上电,按k3就可以平衡。

我都已经跑了几个小时了。   待会就把程序覆盖掉了。 我先观察下目前做的效果。 然后重新写一遍。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-12 11:05:26 | 显示全部楼层
fire 发表于 2016-9-12 10:45
已经烧写好历程的了,上电,按k3就可以平衡。

这个速度差确实不小。 有点打转了都。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-13 12:50:30 | 显示全部楼层
昨天拿到车,今天开始肢解了。 拆掉螺丝,只留下板子,然后整理了下上面的芯片资料和需要软件配置的部分。 A6CDEFA6BBB3A74AB83EBDD3B5B210A1.jpg
这个是拆掉之后的单独测试板子的时候。我仔细核对了芯片和电路,然后打算进入程序调试阶段。
QQ截图20160913124523.png
这是理出来的程序模块。根据模块一步一步的来写驱动了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-13 12:54:05 | 显示全部楼层
。。。。。。。。。。。。。。。持续更新中。。。。。。。。。。。。。。。。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-18 15:05:16 | 显示全部楼层
中秋节回家去了,今天更新电机控制那块。  为了让平衡车立起来,最先做的事就是让电机转起来了,而且是要能控制方向,转速的。那么这就需要我们来配置两路PWM了,要求是互补,插入死区,随时更新占空比。这样就能控制正反转和速度了。虽然很多人都懂怎么去配置PWM,但是我们也会有不少新手在学习,那么我在这里还是给大家啰嗦下,我会尽量详细。那什么叫做PWM,互补,死区,占空比。PWM,叫脉冲宽度调制,它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中(这个是百度说的)。用我自己的话来说就是一组高低电平的组合,类似正弦波(大家都知道y=sinx的波形。)只不过我们常用的PWM是方波类型的。在一个周期内,调节高电平占整个周期的比例叫做调节占空比。
PWM1.png
常用PWM

互补指的是两条PWM输出你高我低,此起彼伏的的波形。
PWM2.png
互补的PWM
那什么叫死区呢,,其实死区的由来,是根据电机驱动MOS来的,MOS的开关与内部寄生电容关系比较大,电机是通过MOS搭建的H桥来驱动的。H桥分为上桥和下桥。
QQ截1.jpg
可以看到电机正常驱动的时候电流流动方向是按照黄线和红线的。在无死区的PWM驱动下电流流动方向是蓝色的,这将导致上下桥同时导通。结果是灾难性的,Q1,Q2会直接短路,轻则被过流保护,重则直接烧毁。
QQ截图20160918144328副本.jpg
这个便是带了死区ts的互补的PWM输出。 在stm32里面只有高级定时器才有这个功能。基础部分先啰嗦这么多。接下来便是重要部分代码贴出来了。
首先是定时器TIM1的初始化部分:
QQ截图20160918144940.png
QQ截图20160918144950.png
QQ截图20160918145008.png
QQ截图20160918145021.png
QQ截图20160918145036.png
由于不知道怎么贴代码,所以采用了图片的方式,只要能看懂就好。  当然在这里大家必须直接采用两个IO口来驱动,只需要保证两个IO翻转有一个死区即可,实际上咱们平衡车的电路设计也是单独的。并未按照互补的TIM来设计。所以以下方法是最实用的。
QQ截图20160918145655.png
分别采用了TIM1的不同通道来控制PWM,而不是互补的。
QQ截图20160918150022.png 这个便是单独用IO控制电机的方式。到这里,平衡车的正反驱动就OK了。下期更新编码器的速度捕获,然后接着是两个电机不同速度的算法调节。先说这么多了。



回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-9-22 16:47:55 | 显示全部楼层
challee 发表于 2016-9-18 15:05
中秋节回家去了,今天更新电机控制那块。  为了让平衡车立起来,最先做的事就是让电机转起来了,而且是要能 ...

前面我们看了小车的PWM等等东西, 现在我实际驱动电机。 03CYBO2HINGE342FK8H@06K.png 通过这张图我们可以看到  电机A要旋转有几个条件, PWM要拉高,IN1,IN2分别是0,1。也就是说IN1,IN2用来选择方向, PWM用来控制速度。 下面的代码便是小车上用来驱动电机正反转的。
X{$KIKH7$X_]~_8JY3TP.png
F_6EMU4)3TFH0`FW}H1JB[0.png
至于电机正反转时候编码器的波形图如下。
正反转.jpg
可以看到无论电机速度是多少,高电平和低电平持续的时间是一样的,所以我们在测速的时候只需要不过PMW中高电平的时间
下期更新,定时器控制PWM速度, 并采用TIM2来捕获编码器的高电平时间来测速。
回复 支持 反对

使用道具 举报

发表于 2016-9-22 16:52:55 | 显示全部楼层
写的非常好,cool
回复 支持 反对

使用道具 举报

发表于 2016-9-22 17:11:05 | 显示全部楼层
讲的很详细,颇有讲师风范,哈哈
回复 支持 反对

使用道具 举报

发表于 2016-10-6 21:38:26 | 显示全部楼层
期待楼主的更新,已经准备好小板凳
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-10 10:12:06 | 显示全部楼层
smtudou 发表于 2016-10-6 21:38
期待楼主的更新,已经准备好小板凳

最近项目忙,预计这两天就会更新下一期了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-17 17:25:55 | 显示全部楼层
challee 发表于 2016-9-22 16:47
前面我们看了小车的PWM等等东西, 现在我实际驱动电机。 通过这张图我们可以看到  电机A要旋转有几个条件 ...

相隔有一段时间, 因为工作原因,进度有点慢了。 最近在加快速度。 这期更新PWM控制电机调速和电机速度的捕获。
上期我们讲过我们平衡车中采用的电机驱动是TB6612FNG这块芯片,对于这块芯片我们只需要控制相应的驱动引脚便能驱动电机旋转,如图:

MOTA_IN1       MOTB_IN1      控制脚1
MOTA_IN2       MOTB_IN2      控制脚2
MOTA_PWM    MOTB_PWM    PWM控制脚  
可以看到分别是对MOTA和MOTB这两个电机的控制引脚,每个电机有三个引脚, 通俗点讲就是MOTA_IN1给高电平   MOTA_IN2给低电平   MOTA_PWM   给高电平(PMW满占空比),这样电机就会朝一个方向旋转。调速即是采用stm32的TIM对 MOTA_PWM   给予不同的占空比。调方向即是对MOTA_IN1  和     MOTA_IN2    给相反的电平。
对于速度捕获,这里涉及到编码器,编码器有很多种,不一一介绍,在这里使用的编码器是霍尔编码器,原理就是通过磁性元件检测电机内部磁场来给出测速脉冲。我们这里采用的电机 和编码器如图:

可以看到,我们采用的电机是1:30的减速箱,编码器线数是390线。我在论坛上也看到有同学在问怎样通过编码器去测电机的转速,在这里我将详细解释下。 390线的编码器代表的意思是电机旋转一周(360°) 通过编码器输出的脉冲数有390个高电平。那么它的精度便是360/390=0.92°(每一个脉冲的角度)我们采用的轮胎的半径R=32.5mm。周长=2πR=204.1mm。
现在假设我们测得了390个脉冲的时间是1S,这意味着电机旋转一周用了1S的时间。那么速度V=S/T=204.1/1=204.1mm/S。这样,我们的速度就计算出来了。
其中用到一个关键的问题是,怎样去测量编码器输出的这个脉冲数。这里用到了一个定时器捕获/比较功能。对于这个功能的原理这里不做多介绍,火哥的教程讲的很详细,大家不懂可以去翻翻。定时器捕获实际上是测量一段高或底电平的时间。我们以MOTB电机为例:

这是测量电机B的编码器的两个通道,分别对应了STM32的两个引脚PA0和PA1这两个脚分别对应了TIM2_CH1和TIM2_CH2如图:

我在后面会贴出,如何用TIM2捕获编码器的代码,和如何用TIM1的通道1和通道4去产生PWM控制电机的转速。
  
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-17 17:26:47 | 显示全部楼层
challee 发表于 2016-9-22 16:47
前面我们看了小车的PWM等等东西, 现在我实际驱动电机。 通过这张图我们可以看到  电机A要旋转有几个条件 ...

相隔有一段时间, 因为工作原因,进度有点慢了。 最近在加快速度。 这期更新PWM控制电机调速和电机速度的捕获。
上期我们讲过我们平衡车中采用的电机驱动是TB6612FNG这块芯片,对于这块芯片我们只需要控制相应的驱动引脚便能驱动电机旋转,如图:
9]PB%K(ZIPB9}0_5~[690PE.png
MOTA_IN1       MOTB_IN1      控制脚1
MOTA_IN2       MOTB_IN2      控制脚2
MOTA_PWM    MOTB_PWM    PWM控制脚  
可以看到分别是对MOTA和MOTB这两个电机的控制引脚,每个电机有三个引脚, 通俗点讲就是MOTA_IN1给高电平   MOTA_IN2给低电平   MOTA_PWM   给高电平(PMW满占空比),这样电机就会朝一个方向旋转。调速即是采用stm32的TIM对 MOTA_PWM   给予不同的占空比。调方向即是对MOTA_IN1  和     MOTA_IN2    给相反的电平。
对于速度捕获,这里涉及到编码器,编码器有很多种,不一一介绍,在这里使用的编码器是霍尔编码器,原理就是通过磁性元件检测电机内部磁场来给出测速脉冲。我们这里采用的电机 和编码器如图:
SFJO)1SNSD~~S$E3N9KSF{H.png
可以看到,我们采用的电机是1:30的减速箱,编码器线数是390线。我在论坛上也看到有同学在问怎样通过编码器去测电机的转速,在这里我将详细解释下。 390线的编码器代表的意思是电机旋转一周(360°) 通过编码器输出的脉冲数有390个高电平。那么它的精度便是360/390=0.92°(每一个脉冲的角度)我们采用的轮胎的半径R=32.5mm。周长=2πR=204.1mm。
现在假设我们测得了390个脉冲的时间是1S,这意味着电机旋转一周用了1S的时间。那么速度V=S/T=204.1/1=204.1mm/S。这样,我们的速度就计算出来了。
其中用到一个关键的问题是,怎样去测量编码器输出的这个脉冲数。这里用到了一个定时器捕获/比较功能。对于这个功能的原理这里不做多介绍,火哥的教程讲的很详细,大家不懂可以去翻翻。定时器捕获实际上是测量一段高或底电平的时间。我们以MOTB电机为例:
}G(D4(XKYZ3_R31(H~WEF.png
这是测量电机B的编码器的两个通道,分别对应了STM32的两个引脚PA0和PA1这两个脚分别对应了TIM2_CH1和TIM2_CH2如图:
9A[1CT]SM`%8%_FT75Y19G8.png
我在后面会贴出,如何用TIM2捕获编码器的代码,和如何用TIM1的通道1和通道4去产生PWM控制电机的转速。
  
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-17 17:29:03 | 显示全部楼层
本帖最后由 challee 于 2016-10-17 17:36 编辑
challee 发表于 2016-10-17 17:26
相隔有一段时间, 因为工作原因,进度有点慢了。 最近在加快速度。 这期更新PWM控制电机调速和电机速度的 ...
  1. 由野火的工程改编而来的定时器捕获
  2. //这个便是TIM2的通道1的捕获功能
  3. static void TIMx_CAPTURE_GPIO_Config(void)    //配置引脚PA0
  4. {
  5.   GPIO_InitTypeDef GPIO_InitStructure;


  6.   /* GPIOA and GPIOB clock enable */
  7.   macTIM_GPIO_APBxClock_FUN (macTIM_GPIO_CLK | RCC_APB2Periph_AFIO, ENABLE);

  8.   /*GPIOA Configuration: TIM5 channel 1 as alternate function push-pull */
  9.   GPIO_InitStructure.GPIO_Pin =  macTIM_INPUT_PIN;
  10.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//GPIO_Mode_IN_FLOATING;                    
  11.   GPIO_Init(macTIM_INPUT_PORT, &GPIO_InitStructure);
  12.         
  13.         GPIO_ResetBits(GPIOA,GPIO_Pin_0);//                                               
  14.         
  15. }



  16. static void TIMx_CAPTURE_Mode_Config(void)   //配置TIM2的模式
  17. {
  18.         TIM_ICInitTypeDef        TIM_ICInitStructure;
  19.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

  20.         
  21.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);        //打开TIM2的时钟
  22.    
  23.         TIM_TimeBaseStructure.TIM_Period      = macTIM_Period;                //这个值为0xFFFF,是自动捕获的重载值,为了加大捕获时间,这个值尽量设大。所以采用的0xFFFF,        
  24.         TIM_TimeBaseStructure.TIM_Prescaler   = macTIM_Prescaler - 1;     //时钟                     
  25.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;         
  26.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;     //计数模式向上
  27.         TIM_TimeBaseInit(macTIMx, &TIM_TimeBaseStructure);                 

  28.         //TIM2的捕获设置
  29.         TIM_ICInitStructure.TIM_Channel     = macTIM_Channel_x;            
  30.         TIM_ICInitStructure.TIM_ICPolarity  = macTIM_STRAT_ICPolarity;        //上升沿捕获
  31.         TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
  32.         TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;                  
  33.         TIM_ICInitStructure.TIM_ICFilter    = 0x00;                       
  34.         TIM_ICInit(macTIMx, &TIM_ICInitStructure);

  35.        //产生捕获中断
  36.         TIMx_NVIC_Configuration();

  37.         TIM_ITConfig ( macTIMx, TIM_IT_Update | macTIM_IT_CCx, ENABLE );

  38.         TIM_Cmd ( macTIMx, ENABLE );         
  39.         
  40. }


  41. static void TIMx_NVIC_Configuration(void)
  42. {
  43.         NVIC_InitTypeDef NVIC_InitStructure;


  44.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);                                                                                                         
  45.         NVIC_InitStructure.NVIC_IRQChannel = macTIMx_IRQn;         
  46.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  47.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        
  48.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  49.         NVIC_Init(&NVIC_InitStructure);
  50.         
  51. }


  52. //初始化函数,放到主函数调用
  53. void TIMx_Capture_Init(void)
  54. {
  55.         TIMx_CAPTURE_GPIO_Config();
  56.         TIMx_CAPTURE_Mode_Config();        
  57. }


  58. static uint32_t BSP_CPU_ClkFreq ( void )           //这个是获取CPU频率,因为要计算捕获的时间
  59. {
  60.         RCC_ClocksTypeDef  rcc_clocks;


  61.         RCC_GetClocksFreq(&rcc_clocks);              

  62.         return ((uint32_t)rcc_clocks.HCLK_Frequency);  
  63. }


  64. u32 Print_TIMx_ulTime(void)
  65. {
  66.                 uint32_t ulTmrClk, ulTime;
  67.                 ulTmrClk = BSP_CPU_ClkFreq() / macTIM_Prescaler;                                         
  68.                 if ( strCapture .ucFinishFlag == 1 )                                                   
  69.                 {
  70.                         ulTime = strCapture .usPeriod * macTIM_Period + strCapture .usCtr;                  
  71.                         
  72.                         printf ( "\r\n  捕获的高电平时间   %d   %d.%d s\r\n", ulTime,ulTime / ulTmrClk, ulTime % ulTmrClk ); //′
  73.                         
  74.                         strCapture .ucFinishFlag = 0;
  75.                         
  76.                 }
  77.                 return ulTime;
  78. }

  79. 后面还有中断函数的内容,由于和火哥的工程一样,没有修改,所以下面贴PWM调速的。
复制代码

回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-17 17:43:54 | 显示全部楼层

  1. //这个便是PWM调速的函数,分别是通道1和通道4

  2. static void Tim1_Open(void)
  3. {
  4.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO|RCC_APB2Periph_TIM1,ENABLE);
  5. }

  6. static void Tim1_GPIO_init(void)   //初始化通道1 PA8  通道2  PA11
  7. {
  8.         GPIO_InitTypeDef GPIO_InitStructure;
  9.        
  10.         GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8|GPIO_Pin_11;
  11.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;       
  12.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  13.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  14. }

  15. static void TIM1_Configuration(void)  //配置TIM1的周期和占空比
  16. {
  17.                 TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  18.                 TIM_OCInitTypeDef        TIM_OCInitStructure;
  19.                 TIM_BDTRInitTypeDef      TIM_BDTRInitStructure;
  20.        
  21.                 TIM_TimeBaseStructure.TIM_Period =100-1;   //周期是100,实际上这里就是0.1ms
  22.                 TIM_TimeBaseStructure.TIM_Prescaler = 72-1;
  23.                 TIM_TimeBaseStructure.TIM_ClockDivision=0;
  24.                 TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数
  25.                 TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
  26.                 TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);
  27.        
  28.                 TIM_ARRPreloadConfig(TIM1,ENABLE);

  29.                 TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
  30.                 TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
  31.                 TIM_OCInitStructure.TIM_OutputNState =TIM_OutputNState_Enable;
  32.                 TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
  33.                 TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_High;
  34.                 TIM_OCInitStructure.TIM_Pulse=10;  //高电平的时间  比如周期是0.1ms  高电平时间是0.01ms  占空比是10%
  35.        
  36.                 TIM_OC1Init(TIM1,&TIM_OCInitStructure);               
  37.                 TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);   //通道1
  38.                
  39.        
  40.                 TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
  41.                 TIM_OCInitStructure.TIM_OutputNState =TIM_OutputNState_Enable;
  42.                 TIM_OCInitStructure.TIM_Pulse=10;
  43.                 TIM_OC4Init(TIM1,&TIM_OCInitStructure);
  44.                 TIM_OC4PreloadConfig(TIM1,TIM_OCPreload_Enable);   //通道4
  45.                

  46.                 TIM_BDTRInitStructure.TIM_OSSRState=TIM_OSSRState_Enable;
  47.                 TIM_BDTRInitStructure.TIM_OSSIState=TIM_OSSIState_Enable;
  48.                 TIM_BDTRInitStructure.TIM_LOCKLevel=TIM_LOCKLevel_OFF;
  49.                 TIM_BDTRInitStructure.TIM_DeadTime=0X90;   //这个是死区时间设置,这个可以不要
  50.                 TIM_BDTRInitStructure.TIM_Break=TIM_Break_Disable;
  51.                 TIM_BDTRInitStructure.TIM_BreakPolarity=TIM_BreakPolarity_High;
  52.                 TIM_BDTRInitStructure.TIM_AutomaticOutput=TIM_AutomaticOutput_Enable;
  53.                 TIM_BDTRConfig(TIM1,&TIM_BDTRInitStructure);
  54.                
  55.                 TIM1->CR2&=0X0000;   
  56.                 TIM_Cmd(TIM1,ENABLE);   
  57.                 TIM_CtrlPWMOutputs(TIM1,ENABLE);  //打开输出
  58. }

  59. void TIM1PwmChangeChannel_1(u16 pwm)      //pwm   调节通道1的占空比
  60. {
  61. //                TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  62.                 TIM_OCInitTypeDef        TIM_OCInitStructure;

  63.                 TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
  64.                 TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
  65.                 TIM_OCInitStructure.TIM_OutputNState =TIM_OutputNState_Enable;
  66.                 TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
  67.                 TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_High;
  68.                 TIM_OCInitStructure.TIM_Pulse=pwm;   
  69.        
  70.                 TIM_OC1Init(TIM1,&TIM_OCInitStructure);
  71.                
  72.                 TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);
  73. }

  74. void TIM1PwmChangeChannel_4(u16 pwm)     
  75. {
  76. //                TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  77.                 TIM_OCInitTypeDef        TIM_OCInitStructure;

  78.                 TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
  79.                 TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
  80.                 TIM_OCInitStructure.TIM_OutputNState =TIM_OutputNState_Enable;
  81.                 TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
  82.                 TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_High;
  83.                 TIM_OCInitStructure.TIM_Pulse=pwm;   
  84.        
  85.                 TIM_OC4Init(TIM1,&TIM_OCInitStructure);
  86.                
  87.                 TIM_OC4PreloadConfig(TIM1,TIM_OCPreload_Enable);
  88. }

  89. void ChangePwmChannel_1_4(u16 pwm1,u16 pwm2)
  90. {
  91.         TIM1PwmChangeChannel_1(pwm1);
  92.         TIM1PwmChangeChannel_4(pwm2);
  93. }


  94. void TIM1_PWM_Init(void)
  95. {
  96.         Tim1_Open();
  97.         Tim1_GPIO_init();
  98.         TIM1_Configuration();
  99. }

复制代码


回复 支持 反对

使用道具 举报

发表于 2016-10-18 15:24:56 来自手机 | 显示全部楼层
谁给我一份读取编码器的代码
回复 支持 反对

使用道具 举报

发表于 2016-10-31 14:00:54 | 显示全部楼层

改变脉冲宽度不是直接有个函数是  TIM_SetCompare1()吗
回复 支持 反对

使用道具 举报

发表于 2016-11-5 14:04:05 | 显示全部楼层
没有编码器得代码,求求求!
回复 支持 反对

使用道具 举报

发表于 2017-2-28 08:46:14 | 显示全部楼层
大神啊,顶顶顶
回复 支持 反对

使用道具 举报

发表于 2017-3-9 19:56:32 | 显示全部楼层
咋没了呀,算法呢
回复 支持 反对

使用道具 举报

发表于 2017-7-25 09:19:09 | 显示全部楼层
你好!!可以分享下 平衡车的资料吗??原理图、原件封装、程序代码  或者其他的。  我想把项目做个复盘。资源有限。。。所以需要一些资料。我的邮箱:jxg.mode@foxmail.com
回复 支持 反对

使用道具 举报

发表于 2017-10-14 21:18:51 | 显示全部楼层
没了????????
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-22 16:34 , Processed in 0.041435 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表