野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12651|回复: 2

定时器主从模式输出精确个数脉冲(STM32F429IG)

[复制链接]
发表于 2017-9-15 16:11:43 | 显示全部楼层 |阅读模式
本帖最后由 qiyang1993 于 2017-9-15 16:21 编辑
  1. #include "bsp_ServoMotor.h"

  2. void ServoMotor_Pulse_Init(void)
  3. {
  4.         /* 结构体初始化 */
  5.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;//定时器结构体
  6.   TIM_OCInitTypeDef  TIM_OCInitStructure;//定时器复用结构体
  7.         GPIO_InitTypeDef GPIO_InitStructure;
  8.         
  9.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2| RCC_APB1Periph_TIM3, ENABLE);
  10.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  11.         
  12.         /* 定时器通道引脚复用 */
  13.         GPIO_PinAFConfig(TIM2_GPIO_PORT,TIM2_PINSOURCE,TIM2_AF);
  14.         /* 定时器通道引脚复用 */
  15.         GPIO_PinAFConfig(TIM3_GPIO_PORT,TIM3_PINSOURCE,TIM3_AF);

  16.         
  17.                 /* 定时器通道引脚配置 */                                                                                                                           
  18.         GPIO_InitStructure.GPIO_Pin = TIM2_PIN| TIM3_PIN;        
  19.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;   
  20.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  21.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  22.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  23.         GPIO_Init(TIM3_GPIO_PORT, &GPIO_InitStructure);
  24.         
  25.         GPIO_Init(TIM2_GPIO_PORT, &GPIO_InitStructure);
  26.         
  27.         
  28.         /* TIM2工作在单脉冲模式下 */
  29.         TIM_TimeBaseStructure.TIM_Period = 1000-1;        //100US
  30.         TIM_TimeBaseStructure.TIM_Prescaler = 9000-1;         
  31.   TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;// 采样时钟分频  
  32.   TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;// 计数方式               
  33.         TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);// 初始化定时器TIM2
  34.         
  35.         TIM_SelectOnePulseMode(TIM2,TIM_OPMode_Single);//设置TIM2在单脉冲模式,且是单一的脉冲,在下一个更新事件停止
  36.   TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);//使能定时器2的通道1预装载寄存器
  37.   TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_OC1Ref);
  38.         
  39.         TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);//使能定时器2的通道1预装载寄存器
  40.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;//在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平
  41.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//OC1输出使能
  42.   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//有效电平为高
  43.   TIM_OCInitStructure.TIM_Pulse = 20;//比较捕获1的预装载值
  44.   TIM_OC1Init(TIM2, &TIM_OCInitStructure);
  45.   TIM_Cmd(TIM2,DISABLE);//先不使能能TIM2
  46.         
  47.         
  48.         /* tim3工作在从模式的门控模式下的PWM输出模式 */
  49.         TIM_TimeBaseStructure.TIM_Period = TIM3per;        
  50.         TIM_TimeBaseStructure.TIM_Prescaler = 900-1;        
  51.   TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  52.   TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数模式        
  53.         TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);//TIM2初始化
  54.         
  55.         TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Gated);//TIM3为门控模式
  56.   TIM_SelectMasterSlaveMode(TIM3,TIM_MasterSlaveMode_Enable);//使能TIM3的主从模式
  57.   TIM_SelectInputTrigger(TIM3,TIM_TS_ITR1);//内部触发,从TIM2触发
  58.         
  59.         TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);
  60.   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;//在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平
  61.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//OC1输出使能
  62.   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//有效电平为高
  63.   TIM_OCInitStructure.TIM_Pulse = TIM3per/2;//比较捕获1的预装载值
  64.   TIM_OC1Init(TIM3,&TIM_OCInitStructure);
  65.   TIM_Cmd(TIM3,ENABLE);//使能TIM3
  66. }

  67. void ServoMotor_Control(u16 cycle, u16 pulse_num)
  68. {
  69.   u16 arr3 = 0;
  70.   u32 Time = 0;
  71.         if(pulse_num)
  72.   {
  73.                 Time = cycle * pulse_num / 100;//预分频为9000,100us计数一次
  74.                 arr3 = cycle / 10;             //预分频为900,10us计数一次
  75.                 TIM_SetAutoreload(TIM2, Time + 19);//低电平周期加高电平周期
  76.                 TIM_SetAutoreload(TIM3, arr3 - 1);
  77.                 TIM_SetCompare1(TIM3, arr3 / 2); //设置PWM占空比为50%
  78.                 TIM_Cmd(TIM2, ENABLE);//使能TIM2
  79.   }
  80. }
复制代码
[/code]

回复

使用道具 举报

 楼主| 发表于 2017-9-15 16:18:04 | 显示全部楼层
本帖最后由 qiyang1993 于 2017-9-15 16:20 编辑
  1. int main(void)
  2. {

  3.   ServoMotor_Pulse_Init();
  4.                
  5.         while(1)
  6.         {
  7.                 ServoMotor_Control(1000, 50);//1ms->500个脉冲
  8.                 //ServoMotor_Dir(0);
  9.         }

  10. }
复制代码
[/code]
问题:1.我用软件仿真,出来两条直线,感觉自己配置的没错啊
         2.怎样实现脉冲个数加减功能,求指导
回复 支持 反对

使用道具 举报

发表于 2017-11-8 17:02:11 | 显示全部楼层
楼主的问题解决没?可否交流一下,QQ号:373928348
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 14:17 , Processed in 0.030543 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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