找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5016|回复: 3
打印 上一主题 下一主题
收起左侧

小白学stm32,利用pwm产生两路pwm波,我总是发现有问题!

[复制链接]
跳转到指定楼层
楼主
ID:128488 发表于 2016-12-24 12:52 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
如题,我利用pwm波产生两路的Pwm波去产生点击的驱动信号,并且进行调速,但是呢你发现有很多的问题,希望高手解答,谢谢!
首先说明下我是用的正点原子的开发板调试的,程序也是用的他们的程序改的,但是我感觉这个pwm 并没有按照我设定的调速,左右两个轮子并不能实现独立的改变占空比,如都是50%,或者一个50%一个40%然后一个递减,实现转弯之类的。代码如下所示:
  1. #include "stm32f10x.h"
  2. #include "led.h"
  3. #include "delay.h"
  4. #include "timer.h"

  5. u16 pwmval=0;   
  6. u16 pwmval1=0;
  7.   u8  change=1;   
  8.         u8  change1=1;
  9. int main(void)
  10. {
  11.        
  12.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  13.         LED_Init();
  14.         delay_init();
  15.         Timer3_Init(899,0,100,400);
  16.         while(1)
  17.         {
  18.                 if(change)     pwmval++;
  19.                 else           pwmval--;
  20.                 delay_ms(10);
  21.                 if(pwmval>200) change=0;
  22.                 if(pwmval==0)  change=1;                         //pwmval×÷ÎaÕ¼¿Õ±è
  23.                
  24.                 if(change1)     pwmval1++;
  25.                 else           pwmval1--;
  26.                         delay_ms(10);
  27.                 if(pwmval1>200) change1=0;
  28.                 if(pwmval1==0)    change1=1;  
  29.     TIM_SetCompare1(TIM3,pwmval1);
  30.                 TIM_SetCompare2(TIM3,pwmval);                //
  31.         }
  32.        
  33. }
复制代码
timer.c
  1. #include "timer.h"
  2. #include "led.h"
  3. void Timer3_Init(u16 arr, u16 psc,u16 CCR1,u16 CCR2)
  4. {
  5.         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;                  //定时器初始化结构体
  6.         GPIO_InitTypeDef GPIO_InitStruct;                                //IO初始化结构体
  7.         TIM_OCInitTypeDef TIM_OCInitStruct;                              //通道设置结构体
  8.        

  9.           RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);              //开启定时器2时钟
  10.           RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);        //开启IO口时钟和复用
  11.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);        //开启IO口
  12.        
  13.        
  14.         TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
  15.         TIM_TimeBaseInitStruct.TIM_Period=arr;
  16.         TIM_TimeBaseInitStruct.TIM_Prescaler=psc;
  17.         TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
  18.        
  19.         TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);                  //定时器初始化
  20.        
  21.        
  22.          
  23.         //TIM_Cmd(TIM3,ENABLE);                                           //使能定时器2时钟
  24.        
  25.        
  26.         /********************************************************************************8
  27.                                    一下为IO口的配置
  28.        
  29.         *********************************************************************************/
  30.        
  31.        
  32.         //GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);                             //设置定时器3重映射

  33.        

  34.         GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
  35.         GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;
  36.         GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
  37.         GPIO_Init(GPIOA,&GPIO_InitStruct);                                              //PA.6初始化,对应于定时器3通道1
  38.        
  39.         GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
  40.         GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5;
  41.         GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
  42.         GPIO_Init(GPIOB,&GPIO_InitStruct);
  43. //       
  44. //        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
  45. //        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5;
  46. //        GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
  47. //        GPIO_Init(GPIOE,&GPIO_InitStruct);

  48.         /************************************************************************************
  49.                                      以下为通道相关设置
  50.        
  51.         ************************************************************************************/

  52.         TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM2;  
  53.         TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;                            //高电平
  54.         TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
  55.         TIM_OCInitStruct.TIM_Pulse=CCR2;
  56.         TIM_OC2Init(TIM3,&TIM_OCInitStruct);                                            //通道2初始化、
  57.        
  58.         TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);
  59.        
  60.         TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM2;   
  61.         TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;                            //高电平
  62.         TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
  63.         TIM_OCInitStruct.TIM_Pulse=CCR1;
  64.         TIM_OC1Init(TIM3,&TIM_OCInitStruct);                                            //通道1初始化、
  65.        
  66.         TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);
  67. //        TIM_CtrlPWMOutputs(TIM3,ENABLE);
  68. //  TIM_ARRPreloadConfig(TIM3,ENABLE);       
  69.         TIM_Cmd(TIM3,ENABLE);                                                           //使能定时器3时钟

  70. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

地板
ID:473159 发表于 2020-7-26 16:09 | 只看该作者
你一方面用时基定时,同时又用延时来定时,不出现状况才是奇迹
回复

使用道具 举报

板凳
ID:752799 发表于 2020-7-26 12:08 | 只看该作者
老哥,这个问题你解决没,我也有同样的问题
回复

使用道具 举报

沙发
ID:326783 发表于 2018-6-24 07:04 | 只看该作者
把 if(pwmval>200) change=0;
                if(pwmval==0)  change=1;
change改为pwmval试试
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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