OpenEdv-开源电子网

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

通用定时器PWM控制两个舵机,延时1秒旋转90度(简化版)

[复制链接]

28

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2019-10-16
在线时间
18 小时
发表于 2019-11-24 20:27:18 | 显示全部楼层 |阅读模式
key.h
  1. #ifndef __KEY_H
  2. #define __key_h
  3. #include "sys.h"

  4. #define KEY0  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)
  5. #define KEY1  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)

  6. #define KEY0_PRES         1        //KEY0按下
  7. #define KEY1_PRES          2        //KEY1按下

  8. void KEY_Init(void);//IO初始化


  9. #endif
复制代码


key.c
  1. #include "key.h"
  2. #include "delay.h"

  3. void KEY_Init(void) //IO初始化
  4. {
  5.         GPIO_InitTypeDef GPIO_InitStructure;

  6.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);//使能PORTA,PORTE时钟

  7.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4|GPIO_Pin_3;//KEY0-KEY1
  8.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
  9.         GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE4,3

  10.         //初始化 WK_UP-->GPIOA.0          下拉输入
  11.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;
  12.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,默认下拉          
  13.         GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0

  14. }
复制代码


pwm.h
  1. #ifndef __PWM_H
  2. #define __PWM_H

  3. #include "sys.h"

  4. void TIM3_PWM_Init1(u16 arr,u16 psc);
  5. void TIM3_PWM_Init2(u16 arr,u16 psc);


  6. #endif
复制代码


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


  2. void TIM3_PWM_Init1(u16 arr,u16 psc)//PA.7
  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);
  11.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  12.        
  13.        
  14.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
  15.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;
  16.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  17.         GPIO_Init(GPIOA,&GPIO_InitStructure);

  18.         TIM_TimeBaseInitstruct.TIM_ClockDivision=TIM_CKD_DIV1;
  19.         TIM_TimeBaseInitstruct.TIM_CounterMode=TIM_CounterMode_Up;
  20.         TIM_TimeBaseInitstruct.TIM_Period=arr;
  21.         TIM_TimeBaseInitstruct.TIM_Prescaler=psc;
  22.         TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitstruct);
  23.        

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


  33. void TIM3_PWM_Init2(u16 arr,u16 psc)//PA.6
  34. {
  35.        
  36.         GPIO_InitTypeDef GPIO_InitStructure;
  37.         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitstruct;
  38.         TIM_OCInitTypeDef TIM_OCInitStructure;
  39.        
  40.        
  41.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  42.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  43.        
  44.        
  45.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
  46.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
  47.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  48.         GPIO_Init(GPIOA,&GPIO_InitStructure);

  49.         TIM_TimeBaseInitstruct.TIM_ClockDivision=TIM_CKD_DIV1;
  50.         TIM_TimeBaseInitstruct.TIM_CounterMode=TIM_CounterMode_Up;
  51.         TIM_TimeBaseInitstruct.TIM_Period=arr;
  52.         TIM_TimeBaseInitstruct.TIM_Prescaler=psc;
  53.         TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitstruct);
  54.        

  55.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择 PWM 模式 2
  56.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  57.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性高
  58.         TIM_OC1Init(TIM3, &TIM_OCInitStructure); //初始化 TIM3 OC1
  59.        
  60.         TIM_Cmd(TIM3, ENABLE);
  61.        
  62.         TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);

  63. }
复制代码


timer.h
  1. #ifndef __TIMER_H
  2. #define __TIMER_H

  3. #include "sys.h"

  4. void TIM2_Init(u16 arr,u16 psc);


  5. #endif
复制代码


timer.c
  1. #include "timer.h"
  2. #include "led.h"




  3. void TIM2_Init(u16 arr,u16 psc)
  4. {
  5.        
  6.         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitstruct;
  7.          NVIC_InitTypeDef NVIC_InitStructure;
  8.        
  9.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
  10.        
  11.         TIM_TimeBaseInitstruct.TIM_ClockDivision=TIM_CKD_DIV1;
  12.         TIM_TimeBaseInitstruct.TIM_CounterMode=TIM_CounterMode_Up;
  13.         TIM_TimeBaseInitstruct.TIM_Period=arr;
  14.         TIM_TimeBaseInitstruct.TIM_Prescaler=psc;
  15.         TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitstruct);
  16.        
  17.         TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
  18.        
  19.         NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;                        //使能按键TIME2所在的中断通道
  20.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;        //抢占优先级2,
  21.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;                                        //子优先级3
  22.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能TIM3中断通道
  23.   NVIC_Init(&NVIC_InitStructure);

  24.         TIM_Cmd(TIM2, ENABLE);        
  25.        
  26. }


  27. void TIM2_IRQHandler()
  28. {
  29.         extern u16 count;
  30.        
  31.         if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
  32.         {
  33.                 LED1=!LED1;//忘了这里影响了判断
  34.                 TIM_ClearITPendingBit(TIM2, TIM_IT_Update );
  35.                 count++;
  36.         }       
  37.        
  38. }
复制代码


main.c

  1. #include "stm32f10x.h"
  2. #include "delay.h"
  3. #include "pwm.h"
  4. #include "timer.h"

  5. u16 count=0;
  6. u16 mark1=0;
  7. u16 mark2=0;
  8. u16 flag1=0;
  9. u16 flag2=0;

  10. int main()
  11. {
  12.         delay_init();
  13.        
  14.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);       

  15.         TIM3_PWM_Init1(199,7199);
  16.         TIM3_PWM_Init2(199,7199);
  17.        
  18.         TIM2_Init(9,7199);
  19.        
  20.         while(1)
  21.         {
  22.                
  23.                 if(KEY0==0)
  24.                 {
  25.                         if(flag1==0)
  26.                         {
  27.                                 mark1=count;
  28.                                 flag1=1;
  29.                         }
  30.                         if(count-mark1>=0)
  31.                         {
  32.                                 TIM_SetCompare1(TIM3,185);
  33.                         }
  34.           }
  35.                 else
  36.                 {
  37.                         TIM_SetCompare1(TIM3,185);
  38.                         flag1=0;
  39.                 }
  40.                
  41.                 if(KEY1==0)
  42.                 {
  43.                         if(flag2==0)
  44.                         {
  45.                                 mark2=count;
  46.                                 flag2=1;
  47.                         }
  48.                         if(count-mark1>=0)
  49.                         {
  50.                                 TIM_SetCompare1(TIM3,185);
  51.                         }
  52.           }
  53.                 else
  54.                 {
  55.                         TIM_SetCompare1(TIM3,185);
  56.                         flag2=0;
  57.                 }
  58. }
  59.                
  60.        
复制代码



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

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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