找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3850|回复: 1
收起左侧

STM32f103单片机按键控制sg90舵机代码

[复制链接]
ID:853162 发表于 2021-4-24 10:21 | 显示全部楼层 |阅读模式
最近学习了stm32,就想用它来控制舵机,然后写下这篇文章分享给大家,如果有理解不到位的地方欢迎大家指正。(我使用的是stm32f103rc型号的开发板,其实也可以用在stm32f103c8上面)
按键控制舵机主要就是通过按键中断来进行pwm舵机函数从而进行控制舵机

单片机源程序如下:
  1. #include "key.h"
  2. #include "delay.h"

  3. void KEY_Init(void)
  4. {
  5.         
  6.         GPIO_InitTypeDef GPIO_InitStructure;

  7.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);//使能PORTA,PORTC时钟

  8.         GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//关闭jtag,使能SWD,可以用SWD模式调试
  9.         
  10.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_1;//PA15
  11.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
  12.          GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOA15
  13.         
  14.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_13;//PC5
  15.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
  16.          GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC5

  17.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;//PA0
  18.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,默认下拉         
  19.         GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0
  20.         
  21. }
  22. //按键处理函数
  23. //返回按键值
  24. //mode:0,不支持连续按;1,支持连续按;
  25. //返回值:
  26. //0,没有任何按键按下
  27. //KEY0_PRES,KEY0按下
  28. //KEY1_PRES,KEY1按下
  29. //WKUP_PRES,WK_UP按下
  30. //注意此函数有响应优先级,KEY0>KEY1>WK_UP!!
  31. u8 KEY_Scan(u8 mode)
  32. {         
  33.         static u8 key_up=1;//按键按松开标志
  34.         if(mode)key_up=1;  //支持连按                  
  35.         if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))
  36.         {
  37.                 delay_ms(10);//去抖动
  38.                 key_up=0;
  39.                 if(KEY0==0)return KEY0_PRES;
  40.                 else if(KEY1==0)return KEY1_PRES;
  41.                 else if(WK_UP==1)return WKUP_PRES;
  42.         }else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1;              
  43.         return 0;// 无按键按下
  44. }
复制代码
这里因为喔只有一个sg90所以我只在WK_UP按键的中断函数中加入了pwm舵机函数,其它的按键大家可以加入其它的外设来达到按键控制外设的目的。
  1. #include "exti.h"
  2. #include "led.h"
  3. #include "key.h"
  4. #include "delay.h"
  5. #include "usart.h"
  6. #include "pwm.h"

  7.          


  8. //外部中断初始化函数
  9. void EXTIX_Init(void)
  10. {

  11.            EXTI_InitTypeDef EXTI_InitStructure;
  12.            NVIC_InitTypeDef NVIC_InitStructure;

  13.           RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//外部中断,需要使能AFIO时钟

  14.           KEY_Init();//初始化按键对应io模式
  15.           PWM_Init();

  16.     //GPIOC.1 中断线以及中断初始化配置
  17.           GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource1);

  18.           EXTI_InitStructure.EXTI_Line=EXTI_Line1;
  19.           EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;        
  20.           EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发
  21.           EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  22.           EXTI_Init(&EXTI_InitStructure);                 //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器

  23.     //GPIOC.13          中断线以及中断初始化配置
  24.           GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource13);

  25.           EXTI_InitStructure.EXTI_Line=EXTI_Line13;
  26.           EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;        
  27.           EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  28.           EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  29.           EXTI_Init(&EXTI_InitStructure);                  //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器

  30.     //GPIOA.0          中断线以及中断初始化配置
  31.           GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);

  32.            EXTI_InitStructure.EXTI_Line=EXTI_Line0;
  33.           EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;        
  34.           EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  35.           EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  36.           EXTI_Init(&EXTI_InitStructure);                //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器



  37.           NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;                        //使能按键所在的外部中断通道
  38.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;        //抢占优先级2
  39.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;                                        //子优先级1
  40.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
  41.           NVIC_Init(&NVIC_InitStructure);            //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
  42.                
  43.                 NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;                        //使能按键所在的外部中断通道
  44.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;        //抢占优先级2,
  45.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;                                        //子优先级1
  46.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
  47.           NVIC_Init(&NVIC_InitStructure);


  48.            NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;                        //使能按键所在的外部中断通道
  49.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;        //抢占优先级2,
  50.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;                                        //子优先级1
  51.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
  52.           NVIC_Init(&NVIC_InitStructure);

  53. }


  54. void EXTI0_IRQHandler(void)
  55. {
  56.   delay_ms(10);    //消抖
  57.         if(WK_UP==1)
  58.         {         
  59.                 LED0=!LED0;
  60.                 LED1=!LED1;        
  61.                 pwm();
  62.         }
  63.         EXTI_ClearITPendingBit(EXTI_Line0);  //清除EXTI0线路挂起位
  64. }
  65. void EXTI1_IRQHandler(void)
  66. {                        
  67.         delay_ms(10);   //消抖                        
  68.         if(KEY0==0)        {
  69.                 LED0=!LED0;
  70.         }
  71.           EXTI_ClearITPendingBit(EXTI_Line1);    //清除LINE5上的中断标志位  
  72. }


  73. void EXTI15_10_IRQHandler(void)
  74. {
  75.   delay_ms(10);    //消抖                        
  76.   if(KEY1==0)        {
  77.                 LED1=!LED1;
  78.         }
  79.          EXTI_ClearITPendingBit(EXTI_Line13);  //清除LINE15线路挂起位
  80. }
复制代码
因为篇幅的限制,大家可以自行下载源码查看。
51黑下载: 按键控制舵机.7z (186.19 KB, 下载次数: 109)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:953725 发表于 2021-7-16 10:20 | 显示全部楼层
舵机自增的程序呢?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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