OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3427|回复: 5

stm32cBT6 用定时器产生pwm控制舵机 加入延时程序却没有效果 新人求助~~

[复制链接]

2

主题

9

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2016-3-21
在线时间
5 小时
发表于 2016-3-21 10:47:58 | 显示全部楼层 |阅读模式
1金钱
我用stm32cBT6做了一块很简单的板子来控制舵机 TIM2 3 4每个定时器有4路pwm输出 现在实现了控制12路舵机 占空比可调 但是想通过加入延时程序 从而实现不同步调节时 延时总是不起作用 一直找不到问题的根源 新手上路 还望走过路过的前辈们指教 程序如下:
主函数:
#include "delay.h"
#include "sys.h"
#include "pwm.h"
#include "usart.h"

int main(void)
{
    SystemInit();
    delay_init();       
    GPIO_Config();
          TIM2_Config();
          delay_ms(1000);
          TIM3_Config();
          delay_ms(1000);
         
    while (1)
    {
    }
}                                


pwm产生函数:
#include "pwm.h"

void GPIO_Config(void)  
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* GPIOA and GPIOB clock enable */
       
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);  

  /*GPIOA Configuration: TIM3 channel 1 and 2 as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0 | GPIO_Pin_1 |GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;           // 复用推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
       
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

  /*GPIOA Configuration: TIM3 channel 1 and 2 as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0 | GPIO_Pin_1 |GPIO_Pin_2 | GPIO_Pin_3 |GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;           // 复用推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void TIM2_Config(void)  
{  
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;  
    TIM_OCInitTypeDef  TIM_OCInitStructure;  
    /* PWM信号电平跳变值*/

          u16 CCR1=7500;
          u16 CCR2=4500;
          u16 CCR3=7500;
          u16 CCR4=7500;
               
    /*PCLK1经过2倍频后作为TIM2的时钟源等于72MHz*/  
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);  
    /* Time base configuration */                                            
    TIM_TimeBaseStructure.TIM_Period =0xEA5F;  
    TIM_TimeBaseStructure.TIM_Prescaler = 23;                                    //设置预分频:预分频=23,即为72/24=3 MHz
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;                                //不分频
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;                 //向上计数溢出模式
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);  
    /* PWM1 Mode configuration: Channel1 */  
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                           //配置为pwm模式1
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;               
    TIM_OCInitStructure.TIM_Pulse = CCR1;                                       //设置通道1跳变值
    TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_High;                    //当定时器值小于CCR1时为高电平
    TIM_OC1Init(TIM2, &TIM_OCInitStructure);                                    //使能通道1      
    TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);  
            /* PWM1 Mode configuration: Channel2 */  
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  
    TIM_OCInitStructure.TIM_Pulse = CCR2;                                       //设置通道2跳变值
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;                    //当定时器值小于CCR1时为高电平
    TIM_OC2Init(TIM2, &TIM_OCInitStructure);                                    //使能通道2
    TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);
    /* PWM1 Mode configuration: Channel3 */
                TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;               
    TIM_OCInitStructure.TIM_Pulse = CCR3;                                       //设置通道3跳变值
    TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_High;                    //当定时器值小于CCR1时为高电平  
    TIM_OC3Init(TIM2, &TIM_OCInitStructure);                                    //使能通道3      
    TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);  
    /* PWM1 Mode configuration: Channel4 */  
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  
    TIM_OCInitStructure.TIM_Pulse = CCR4;                                       //设置通道4跳变值
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;                    //当定时器值小于CCR1时为高电平
    TIM_OC4Init(TIM2, &TIM_OCInitStructure);                                    //使能通道4   
    TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);                
    TIM_ARRPreloadConfig(TIM2, ENABLE);                                         //使能定时器2寄存器重装载值
                /* TIM2 enable counter */  
    TIM_Cmd(TIM2, ENABLE);                                                      //使能定时器2   
        }


void TIM3_Config(void)  
{  
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;  
    TIM_OCInitTypeDef  TIM_OCInitStructure;  
    /* PWM信号电平跳变值*/

          u16 CCR1=7500;
          u16 CCR2=4500;
          u16 CCR3=7500;
          u16 CCR4=7500;
               
    /*PCLK1经过2倍频后作为TIM2的时钟源等于72MHz*/  
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);  
    /* Time base configuration */                                            
    TIM_TimeBaseStructure.TIM_Period =0xEA5F;  
    TIM_TimeBaseStructure.TIM_Prescaler = 23;                                    //设置预分频:预分频=23,即为72/24=3 MHz
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;                                //不分频
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;                 //向上计数溢出模式
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);  
    /* PWM1 Mode configuration: Channel1 */  
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                           //配置为pwm模式1
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;               
    TIM_OCInitStructure.TIM_Pulse = CCR1;                                       //设置通道1跳变值
    TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_High;                    //当定时器值小于CCR1时为高电平
    TIM_OC1Init(TIM3, &TIM_OCInitStructure);                                    //使能通道1      
    TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);  
            /* PWM1 Mode configuration: Channel2 */  
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  
    TIM_OCInitStructure.TIM_Pulse = CCR2;                                       //设置通道2跳变值
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;                    //当定时器值小于CCR1时为高电平
    TIM_OC2Init(TIM3, &TIM_OCInitStructure);                                    //使能通道2
    TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
    /* PWM1 Mode configuration: Channel3 */
                TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;               
    TIM_OCInitStructure.TIM_Pulse = CCR3;                                       //设置通道3跳变值
    TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_High;                    //当定时器值小于CCR1时为高电平  
    TIM_OC3Init(TIM3, &TIM_OCInitStructure);                                    //使能通道3      
    TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);  
    /* PWM1 Mode configuration: Channel4 */  
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  
    TIM_OCInitStructure.TIM_Pulse = CCR4;                                       //设置通道4跳变值
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;                    //当定时器值小于CCR1时为高电平
    TIM_OC4Init(TIM3, &TIM_OCInitStructure);                                    //使能通道4   
    TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);                
    TIM_ARRPreloadConfig(TIM3, ENABLE);                                         //使能定时器2寄存器重装载值
                /* TIM3 enable counter */  
    TIM_Cmd(TIM3, ENABLE);                                                      //使能定时器3   
        }


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

23

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
307
金钱
307
注册时间
2015-2-19
在线时间
32 小时
发表于 2016-3-21 13:37:22 | 显示全部楼层
论坛里有不少舵机的例程,找一找。主要就是配置PWM频率和占空比,没啥好说的
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2016-3-21
在线时间
5 小时
 楼主| 发表于 2016-3-21 14:04:41 | 显示全部楼层
only 发表于 2016-3-21 13:37
论坛里有不少舵机的例程,找一找。主要就是配置PWM频率和占空比,没啥好说的

我的程序就是在网上找的 也实现了基本的功能  现在就是控制多个舵机的时候 延时函数不起作用啊 求指教
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2018-7-4
在线时间
10 小时
发表于 2019-9-4 15:50:04 | 显示全部楼层
新手猜想,会不会你这里时钟分频了,所以也影响他的延时函数,他也是函数是在72M基础下写的
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2018-7-4
在线时间
10 小时
发表于 2019-9-4 16:02:06 | 显示全部楼层
楼主你最好有没有找到解决的办法
回复

使用道具 举报

36

主题

227

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3096
金钱
3096
注册时间
2016-4-15
在线时间
350 小时
发表于 2019-9-5 09:32:18 | 显示全部楼层
这种初始化延时加来干嘛??????
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-11 05:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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