OpenEdv-开源电子网

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

通用定时器TIM2345PWM输出控制舵机角度

[复制链接]

28

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2019-10-16
在线时间
18 小时
发表于 2019-11-23 12:43:54 | 显示全部楼层 |阅读模式
通用定时器所用引脚可以从原理图上看到,配置过程几乎一致:
pwm.h
  1. #ifndef __PWM_H
  2. #define __PWM_H

  3. #include "sys.h"

  4. void TIM3_PWM_Init(u16 arr,u16 psc);//可以设置为TIM2/3/4/5

  5. #endif
复制代码



pwm.c
  1. #include "pwm.h"


  2. void TIM3_PWM_Init(u16 arr,u16 psc)
  3. {
  4.        
  5.         GPIO_InitTypeDef GPIO_InitStructure;
  6.         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitstruct;
  7.         TIM_OCInitTypeDef TIM_OCInitStructure;
  8.        
  9.        
  10.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//改变相应的引脚号和时钟号,就能有不同的引脚PWM输出,此处是PA.7,TIM3_CH1没有重映射
  11.         //RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //是否启用重映射
  12.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  13.        
  14.        
  15.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
  16.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;
  17.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  18.         GPIO_Init(GPIOA,&GPIO_InitStructure);
  19.   //GPIO_SetBits(GPIOA,GPIO_Pin_1);//初始为低电平,可有可无
  20.        
  21.         //GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);//是否启用重映射
  22.        

  23.         TIM_TimeBaseInitstruct.TIM_ClockDivision=TIM_CKD_DIV1;
  24.         TIM_TimeBaseInitstruct.TIM_CounterMode=TIM_CounterMode_Up;
  25.         TIM_TimeBaseInitstruct.TIM_Period=arr;
  26.         TIM_TimeBaseInitstruct.TIM_Prescaler=psc;
  27.         TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitstruct);
  28.        

  29.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择 PWM 模式 2
  30.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  31.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性高
  32.         TIM_OC2Init(TIM3, &TIM_OCInitStructure); //初始化 TIM3 OC1
  33.        
  34.         TIM_Cmd(TIM3, ENABLE);
  35.        
  36.         TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);

  37.         //TIM_ARRPreloadConfig(TIM3,ENABLE);//为什么正点原子的教程里没有加这个函数,可没有这个除了例程别的引脚都没法动,加了一次之后就不需要要能控制舵机了(楼主遇到的// //小错误没有可以忽略)
  38. }
复制代码


main.c
  1. #include "stm32f10x.h"
  2. #include "delay.h"
  3. #include "pwm.h"


  4. int main()
  5. {

  6.         u16        delay_time = 500;
  7.         u16 angle=195;
  8.         u8 i;
  9.         delay_init();
  10.        
  11.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);       

  12.         TIM3_PWM_Init(199,7199);

  13.         while(1)
  14.         {
  15.                 for(i=0;i<4;i++)
  16.                 {
  17.                 delay_ms(delay_time);
  18.                 TIM_SetCompare2(TIM3,angle);
  19.                 angle-=5;
  20.                 }
  21.                 for(i=0;i<4;i++)
  22.                 {
  23.                 delay_ms(delay_time);
  24.                 TIM_SetCompare2(TIM3,angle);
  25.                 angle+=5;
  26.                 }
  27.         }       
  28.                
  29. }
复制代码



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

使用道具 举报

6

主题

1127

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1656
金钱
1656
注册时间
2019-8-15
在线时间
102 小时
发表于 2019-11-23 12:50:13 | 显示全部楼层
成功没有捷径
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2019-11-24
在线时间
0 小时
发表于 2019-11-24 12:56:43 | 显示全部楼层
#ifndef __PWM_H #define __PWM_H  #include "sys.h"  void TIM3_PWM_Init(u16 arr,u16 psc);//可以设置为TIM2/3/4/5  #endif
回复 支持 反对

使用道具 举报

28

主题

294

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1790
金钱
1790
注册时间
2018-3-26
在线时间
294 小时
发表于 2019-11-25 09:36:50 | 显示全部楼层
http://www.openedv.com/forum.php ... d=301520&extra=
不如直接下载工程看得更明白
茵茵猪头
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 08:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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