当前位置:   article > 正文

STM32-12路舵机控制_stm32103zet6产生12路pwm控制舵机

stm32103zet6产生12路pwm控制舵机

一:材料准备

12个9G舵机、1个STM32单片机

二:程序

3个定时器的配置,每个定时器4个通道的配置(本文使用的是STM32f103vet6):

  1. //PWM输出初始化
  2. //arr:自动重装值
  3. //psc:时钟预分频数
  4. void TIM4_PWM_Init(u16 arr,u16 psc)
  5. {
  6. GPIO_InitTypeDef GPIO_InitStructure;
  7. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  8. TIM_OCInitTypeDef TIM_OCInitStructure;
  9. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能定时器4时钟
  10. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟
  11. GPIO_PinRemapConfig(GPIO_Remap_TIM4, ENABLE); //Timer4部分重映射
  12. //学习网站 https://www.cnblogs.com/zhoubatuo/p/6135103.html
  13. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; //TIM_CH1
  14. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
  15. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  16. GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化GPIO
  17. //初始化TIM4
  18. TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  19. TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
  20. TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  21. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
  22. TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  23. //初始化TIM4 Channel 1 PWM模式
  24. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式1
  25. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  26. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性高
  27. TIM_OC1Init(TIM4, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM4 OC1
  28. TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM4在CCR2上的预装载寄存器
  29. //初始化TIM4 Channe2
  30. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式1
  31. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  32. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性高
  33. TIM_OC2Init(TIM4, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM4 OC2
  34. TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM4在CCR2上的预装载寄存器
  35. //初始化TIM4 Channe3
  36. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式1
  37. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  38. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性高
  39. TIM_OC3Init(TIM4, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM4 OC3
  40. TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM4在CCR2上的预装载寄存器
  41. //初始化TIM4 Channe4
  42. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式1
  43. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  44. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性高
  45. TIM_OC4Init(TIM4, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM4 OC4
  46. TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM4在CCR2上的预装载寄存器
  47. TIM_Cmd(TIM4, ENABLE); //使能TIM4
  48. }
  49. void TIM3_PWM_Init(u16 arr,u16 psc)
  50. {
  51. GPIO_InitTypeDef GPIO_InitStructure;
  52. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  53. TIM_OCInitTypeDef TIM_OCInitStructure;
  54. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器4时钟
  55. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟
  56. GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE); //Timer3完全重映射
  57. //学习网站 https://www.cnblogs.com/zhoubatuo/p/6135103.html
  58. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9; //TIM_CH1
  59. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
  60. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  61. GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIO
  62. //初始化TIM4
  63. TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  64. TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
  65. TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  66. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
  67. TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  68. //初始化TIM3 Channel 1 PWM模式
  69. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式1
  70. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  71. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性高
  72. TIM_OC1Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC1
  73. TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器
  74. //初始化TIM3 Channe2
  75. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式1
  76. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  77. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性高
  78. TIM_OC2Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC2
  79. TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器
  80. //初始化TIM3 Channe3
  81. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式1
  82. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  83. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性高
  84. TIM_OC3Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC3
  85. TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器
  86. //初始化TIM3 Channe4
  87. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式1
  88. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  89. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性高
  90. TIM_OC4Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC4
  91. TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器
  92. TIM_Cmd(TIM3, ENABLE); //使能TIM3
  93. }
  94. void TIM2_PWM_Init(u16 arr,u16 psc)
  95. {
  96. GPIO_InitTypeDef GPIO_InitStructure;
  97. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  98. TIM_OCInitTypeDef TIM_OCInitStructure;
  99. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能定时器A时钟
  100. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟
  101. // GPIO_PinRemapConfig(GPIO_FullRemap_TIM2, ENABLE); //Timer2 不映射
  102. //学习网站 https://www.cnblogs.com/zhoubatuo/p/6135103.html
  103. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3; //TIM_CH1
  104. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
  105. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  106. GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO
  107. //初始化TIM4
  108. TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  109. TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
  110. TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  111. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
  112. TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  113. //初始化TIM3 Channel 1 PWM模式
  114. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式1
  115. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  116. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性高
  117. TIM_OC1Init(TIM2, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC1
  118. TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器
  119. //初始化TIM3 Channe2
  120. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式1
  121. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  122. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性高
  123. TIM_OC2Init(TIM2, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC2
  124. TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器
  125. //初始化TIM3 Channe3
  126. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式1
  127. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  128. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性高
  129. TIM_OC3Init(TIM2, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC3
  130. TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器
  131. //初始化TIM3 Channe4
  132. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式1
  133. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  134. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性高
  135. TIM_OC4Init(TIM2, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC4
  136. TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器
  137. TIM_Cmd(TIM2, ENABLE); //使能TIM3
  138. }

主程序:

  1. //舵机角度
  2. //TIM_SetCompare1(TIMx,50) 0
  3. //TIM_SetCompare1(TIMx,100) 45
  4. //TIM_SetCompare1(TIMx,150) 90
  5. //TIM_SetCompare1(TIMx,200) 135
  6. //TIM_SetCompare1(TIMx,250) 180
  7. TIM_SetCompare1(TIM4,50);// GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; D
  8. TIM_SetCompare2(TIM4,50);// PD13
  9. TIM_SetCompare3(TIM4,50);// PD14
  10. TIM_SetCompare4(TIM4,50);// DD15
  11. TIM_SetCompare1(TIM3,50);//GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9; C
  12. TIM_SetCompare2(TIM3,50);//PC7
  13. TIM_SetCompare3(TIM3,50);//PC8
  14. TIM_SetCompare4(TIM3,50);//PC9
  15. TIM_SetCompare1(TIM2,50);//GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3; A
  16. TIM_SetCompare2(TIM2,50);//PA1
  17. TIM_SetCompare3(TIM2,50);//PA2
  18. TIM_SetCompare4(TIM2,50);//PA3
  19. while(1)
  20. {
  21. delay_ms(10);
  22. TIM_SetCompare1(TIM2,cont);
  23. TIM_SetCompare2(TIM2,cont);
  24. TIM_SetCompare3(TIM2,cont);
  25. TIM_SetCompare4(TIM2,cont);
  26. TIM_SetCompare1(TIM3,cont);
  27. TIM_SetCompare2(TIM3,cont);
  28. TIM_SetCompare3(TIM3,cont);
  29. TIM_SetCompare4(TIM3,cont);
  30. TIM_SetCompare1(TIM4,cont);
  31. TIM_SetCompare2(TIM4,cont);
  32. TIM_SetCompare3(TIM4,cont);
  33. TIM_SetCompare4(TIM4,cont);
  34. cont++;
  35. if(cont>250)
  36. cont = 50;
  37. }

定时器的配置参考网址:

https://www.cnblogs.com/zhoubatuo/p/6135103.html

有了这些配置,你就可以打造自己的蜘蛛机器人了

有疑问者请联系:QQ:1735915513

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/281080
推荐阅读
相关标签
  

闽ICP备14008679号