找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3456|回复: 0
打印 上一主题 下一主题
收起左侧

STM32F103 倍频 72M 8路舵机控制源码

[复制链接]
跳转到指定楼层
楼主
ID:362385 发表于 2018-6-30 18:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
做的一个舵机,很棒,用处很大

单片机源程序如下:
  1. /*
  2.         单片机:STM32F103RCT6/STM32F103C8T6  倍频 72M 8路舵机控制
  3.         舵机IO PA0~PA3 PB3~PB6
  4. */
  5. #include "stm32f10x_conf.h"
  6. #define tb_interrupt_open() {__enable_irq();}        //总中断打开
  7. void rcc_init(void);                                                        //主频设置
  8. void delay_ms(unsigned int t);                //毫秒级别延时
  9. void dj_io_init(void);                                //舵机 IO 口初始化
  10. void dj_io_set(u8 index, u8 level);        //舵机 IO 口高低电平设置
  11. void TIM2_Int_Init(u16 arr,u16 psc);//舵机 定时器初始化
  12. void gpioA_pin_set(unsigned char pin, unsigned char level);
  13. void gpioB_pin_set(unsigned char pin, unsigned char level);

  14. //舵机脉冲数组
  15. int duoji_pulse[8] = {1500,1500,1500,1500,1500,1500,1500,1500} , i;

  16. int main(void) {       
  17.         rcc_init();
  18.         dj_io_init();
  19.         TIM2_Int_Init(20000,71);
  20.         tb_interrupt_open();
  21.         while(1) {       
  22.                 for(i=0;i<8;i++) {
  23.                         duoji_pulse[i] = 1000;//循环把8个舵机位置设定到1000
  24.                 }
  25.                 delay_ms(1000);
  26.                 for(i=0;i<8;i++) {
  27.                         duoji_pulse[i] = 2000;//循环把8个舵机位置设定到2000
  28.                 }
  29.                 delay_ms(1000);       
  30.         }
  31. }

  32. void rcc_init(void) {
  33.         ErrorStatus HSEStartUpStatus;
  34.         RCC_DeInit();
  35.         RCC_HSEConfig(RCC_HSE_ON);
  36.         HSEStartUpStatus = RCC_WaitForHSEStartUp();
  37.         while(HSEStartUpStatus == ERROR);
  38.         RCC_HCLKConfig(RCC_SYSCLK_Div1);//SYSCLK
  39.         RCC_PCLK1Config(RCC_HCLK_Div2);//APB1  MAX = 36M
  40.         RCC_PCLK2Config(RCC_HCLK_Div1);//APB2  MAX = 72M
  41.         RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
  42.         RCC_PLLCmd(ENABLE);
  43.         while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
  44.         RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
  45.         while(RCC_GetSYSCLKSource() != 0x08);
  46. }


  47. void delay_ms(unsigned int t) {
  48.         int t1;
  49.         while(t--) {
  50.                 t1 = 7200;
  51.                 while(t1--);
  52.         }
  53. }
  54. void dj_io_init(void)  {
  55.         GPIO_InitTypeDef GPIO_InitStructure;       

  56.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);
  57.        
  58.         GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
  59.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  60.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  61.         GPIO_Init(GPIOA, &GPIO_InitStructure);

  62.         GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6 | GPIO_Pin_14;
  63.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  64.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  65.         GPIO_Init(GPIOB, &GPIO_InitStructure);               
  66. }

  67. void dj_io_set(u8 index, u8 level) {
  68.         switch(index) {
  69.                 case 0:gpioA_pin_set(0, level);break;
  70.                 case 1:gpioA_pin_set(1, level);break;
  71.                 case 2:gpioA_pin_set(2, level);break;
  72.                 case 3:gpioA_pin_set(3, level);break;
  73.                 case 4:gpioB_pin_set(3, level);break;
  74.                 case 5:gpioB_pin_set(4, level);break;
  75.                 case 6:gpioB_pin_set(5, level);break;
  76.                 case 7:gpioB_pin_set(6, level);break;
  77.                 default:break;
  78.         }
  79. }

  80. void gpioA_pin_set(unsigned char pin, unsigned char level) {
  81.         if(level) {
  82.                 GPIO_SetBits(GPIOA,1 << pin);
  83.         } else {
  84.                 GPIO_ResetBits(GPIOA,1 << pin);
  85.         }
  86. }

  87. void gpioB_pin_set(unsigned char pin, unsigned char level) {
  88.         if(level) {
  89.                 GPIO_SetBits(GPIOB,1 << pin);
  90.         } else {
  91.                 GPIO_ResetBits(GPIOB,1 << pin);
  92.         }
  93. }


  94. void TIM2_Int_Init(u16 arr,u16 psc) {
  95.         TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  96.         NVIC_InitTypeDef NVIC_InitStructure;
  97.        
  98.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //①时钟 TIM2 使能       
  99.         //定时器 TIM2 初始化
  100.         TIM_TimeBaseStructure.TIM_Period = arr; //设置自动重装载寄存器周期的值
  101.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置时钟频率除数的预分频值
  102.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割
  103.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM 向上计数
  104.         TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);  //②初始化 TIM2
  105.         TIM_ARRPreloadConfig(TIM2, DISABLE);
  106.         TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE );  //③允许更新中断
  107.        
  108.         //中断优先级 NVIC 设置
  109.         NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  //TIM2 中断
  110.         //NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0000);
  111.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //先占优先级 0 级
  112.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;  //从优先级 2 级
  113.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  //IRQ 通道被使能
  114.         NVIC_Init(&NVIC_InitStructure);  //④初始化 NVIC 寄存器
  115.         TIM_Cmd(TIM2, ENABLE);  //⑤使能 TIM2
  116. }

  117. void TIM2_IRQHandler(void) {
  118.         static u8 flag = 0;
  119.         static u8 duoji_index1 = 0;
  120.         int temp;
  121.         if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查 TIM2 更新中断发生与否
  122.         {
  123.                 TIM_ClearITPendingBit(TIM2, TIM_IT_Update ); //清除 TIM2 更新中断标志
  124.                
  125.                 if(duoji_index1 == 8) {
  126. ……………………

  127. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
32单个舵机控制源码.rar (1.22 MB, 下载次数: 36)


评分

参与人数 1黑币 +5 收起 理由
yanyuwei + 5 绝世好帖!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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