项目三:利用PWM波和GPIO控制电机

代码 代码 1265 人阅读 | 0 人回复

<
1、驱动芯片引见
TB6612 的的用法:
     TB6612 是单驱动,也便是能够驱动两个机电上面别离是掌握两个机电的 IO 心:STBY 心接单片机的 IO 心   ,浑整机电局部截至,置 1 /0经由过程 AIN1 AIN2,BIN1,BIN2 去掌握正反转。
2、实值表
144817ap7a0nniaqpbreqb.jpg

3、电路图 
144817bmle4emq2qllmm25.jpg

 
144817vczsmkpzsasmlwss.jpg

 4、PWM留意事项
(1)器件输出形态正在驱动/造动之间切换时,机电转速战 PWM 占空比之间能连结较好的线性干系,其运转掌握成果好过器件正在驱动/截至形态之间切换,以是表 1 中的 INl/IN2 普通没有接纳 L/L 掌握组开。
(2)fPWM 较下时,机电运转持续安稳、乐音小,但器件功耗会随频次降低而删年夜;fPWM 较低时,利于降低功耗,并能进步调速线性度,但太低的频次能够招致机电动弹连接性的降低。凡是 fPWM>1 kHz 时,器件可以不变的掌握机电。
5、空话未几道上代码!!
main.c
  1. #include "motor.h"
  2. #include "stdio.h"
  3. #include "delay.h"
  4. #include "stm32f10x.h"
  5. u8 UART3_data,UART1_data;
  6. u8 UART3_rcv[20],UART3_rcv_count;
  7. u8 UART1_rcv[50],UART1_rcv_count,Uart1_finish;
  8. int main(void)
  9. {
  10. //        int left_speed=5,right_speed=5;
  11.         int speed=5;
  12.        
  13.         delay_init();
  14.         GPIO_init();
  15.         TIME4_init(7199,10);
  16.         car_go(speed);
  17.         delay_s(2);
  18.         car_left(0,2);
  19.         delay_s(1);
  20.         car_go(speed);
  21.         delay_s(2);
  22.         car_stop();
  23.        
  24. }
复造代码
motor.c
  1. #include "motor.h"
  2. //机电GPIO管足初初化函数
  3. /**********************************************************************************/
  4. void GPIO_init(void)
  5. {
  6.         //界说管足的构造体
  7.         GPIO_InitTypeDef GPIO_InitStruct;
  8.         //翻开所要利用的时钟
  9.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  10.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  11.         //将管足PB4特别功用闭失落
  12.         GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
  13.         //设置PB4\5\8\9管足的参数,用于驱动机电
  14.         GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
  15.         GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_8|GPIO_Pin_9;
  16.         GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
  17.         //初初化PB4\5\8\9的管足
  18.         GPIO_Init(GPIOB, &GPIO_InitStruct);
  19.         //设置PB6\7管足的参数,用于发生PWM波
  20.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
  21.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
  22.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  23.         //初初化PB6\7的管足
  24.         GPIO_Init(GPIOB, &GPIO_InitStruct);
  25.         //管足局部先置整
  26.         GPIO_ResetBits(GPIOB,GPIO_Pin_8);
  27.   GPIO_ResetBits(GPIOB,GPIO_Pin_9);
  28.         GPIO_ResetBits(GPIOB,GPIO_Pin_4);
  29.   GPIO_ResetBits(GPIOB,GPIO_Pin_5);
  30.        
  31. }
  32. /***************************************************************************************************************/
  33. //TIME4的初初化函数
  34. /********************************************************************************************/
  35. void TIME4_init(int presc,int arr)
  36. {
  37.          //界说按时器的构造体
  38.          TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
  39.          //界说按时器PWM输出通讲的构造体
  40.          TIM_OCInitTypeDef TIM_OCInitStruct;
  41.          //翻开TIME4的时钟
  42.          RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
  43.          //设置TIME4构造体的参数
  44.          TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1 ;
  45.          TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
  46.          TIM_TimeBaseInitStruct.TIM_Prescaler = presc;
  47.          TIM_TimeBaseInitStruct.TIM_Period =arr;          
  48.          TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStruct);
  49.          //设置TIME4通讲构造体的参数
  50.          TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
  51.          TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
  52.          TIM_OCInitStruct.TIM_OutputState =TIM_OutputState_Enable ;
  53.          TIM_OCInitStruct.TIM_Pulse =0;
  54.           //TIME4通讲1初初化
  55.    TIM_OC1Init(TIM4, &TIM_OCInitStruct);
  56.          //使能TIME4通讲1的预存存放器
  57.          TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
  58.    //TIME4通讲2初初化
  59.    TIM_OC2Init(TIM4, &TIM_OCInitStruct);
  60.          //使能TIME4通讲2的预存存放器
  61.    TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);
  62.    //使能TIME4
  63.          TIM_Cmd(TIM4, ENABLE);
  64. }
  65. /*******************************************************************************************************/
  66. //小车行进函数
  67. /********************************************************************************************************/
  68. void car_go(int speed)
  69. {  
  70.         motor_left_speed(speed);
  71.   motor_right_speed(speed);
  72.         GPIO_SetBits(GPIOB, GPIO_Pin_9);
  73.   GPIO_ResetBits(GPIOB,GPIO_Pin_8);
  74.         GPIO_SetBits(GPIOB, GPIO_Pin_4);
  75.   GPIO_ResetBits(GPIOB,GPIO_Pin_5);
  76. }
  77. /****************************************************************************************************************/
  78. //小车左转函数
  79. /****************************************************************************************************************/
  80. void car_left(int motor_left_speed,int motor_right_speed )
  81. {  
  82.   motor_left_speed(motor_left_speed);
  83.   motor_right_speed(motor_right_speed);
  84.         GPIO_ResetBits(GPIOB,GPIO_Pin_9);
  85.   GPIO_ResetBits(GPIOB,GPIO_Pin_8);
  86.         GPIO_SetBits(GPIOB, GPIO_Pin_4);
  87.   GPIO_ResetBits(GPIOB,GPIO_Pin_5);
  88. }
  89. /****************************************************************************************************************/
  90. //小车左转函数
  91. /****************************************************************************************************************/
  92. void car_right(int motor_left_speed,int motor_right_speed )
  93. {  
  94.         motor_left_speed(motor_left_speed);
  95.   motor_right_speed(motor_right_speed);
  96.         GPIO_ResetBits(GPIOB,GPIO_Pin_8);
  97.   GPIO_SetBits(GPIOB, GPIO_Pin_9);
  98.         GPIO_ResetBits(GPIOB,GPIO_Pin_4);
  99.   GPIO_ResetBits(GPIOB,GPIO_Pin_5);
  100. }
  101. /****************************************************************************************************************/
  102. //小车截至函数
  103. /****************************************************************************************************************/
  104. void car_stop(void)
  105. {  
  106.        
  107.         GPIO_ResetBits(GPIOB,GPIO_Pin_9);
  108.   GPIO_ResetBits(GPIOB,GPIO_Pin_8);
  109.         GPIO_ResetBits(GPIOB,GPIO_Pin_4);
  110.   GPIO_ResetBits(GPIOB,GPIO_Pin_5);
  111. }
  112. /****************************************************************************************************************/
  113. //小车撤退退却函数
  114. /****************************************************************************************************************/
  115. void car_back(int speed)
  116. {  
  117.         motor_left_speed(speed);
  118.   motor_right_speed(speed);
  119.         GPIO_SetBits(GPIOB, GPIO_Pin_8);
  120.   GPIO_ResetBits(GPIOB,GPIO_Pin_9);
  121.         GPIO_SetBits(GPIOB, GPIO_Pin_5);
  122.   GPIO_ResetBits(GPIOB,GPIO_Pin_4);
  123. }
  124. /****************************************************************************************************************/
  125. //提早一秒函数
  126. /****************************************************************************************************************/
  127. void delay_s(int s)
  128. {
  129.         for(;s>0;s--)
  130.         {
  131.         delay_ms(1000);
  132.         }
  133. }
  134. /****************************************************************************************************************/
复造代码
motor.h
  1. #ifndef __MOTOR_H__
  2. #define __MOTOR_H__
  3. //需求挪用的库
  4. #include "stm32f10x_rcc.h"
  5. #include "stm32f10x_gpio.h"
  6. #include "stm32f10x_tim.h"
  7. #include "delay.h"
  8. //宏界说
  9. #define PERIOD 10  //周期为10ms,频次为1Khz
  10. #define motor_left_speed(left_speed)   {TIM_SetCompare1(TIM4, left_speed);}  //将设置PWMA的占空比的函数宏界说
  11. #define motor_right_speed(right_speed)  {TIM_SetCompare2(TIM4, right_speed);}//将设置PWMB的占空比的函数宏界说
  12. //自界说的函数
  13. void GPIO_init(void);
  14. void TIME4_init(int presc,int arr);
  15. void car_go(int speed);
  16. void car_left(int motor_left_speed,int motor_right_speed );
  17. void car_right(int motor_left_speed,int motor_right_speed );
  18. void car_stop(void);
  19. void car_back(int speed);
  20. void delay_s(int s);
  21. #endif
复造代码
最初!!!我把代码正文具体面,期望当前看的懂!

免责声明:假如进犯了您的权益,请联络站少,我们会实时删除侵权内乱容,感谢协作!
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,按照目前互联网开放的原则,我们将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话,请您发送邮箱:Cdnjson@163.com提供相关证明,我们将积极配合您!
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。
回复 关闭延时

使用道具 举报

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

本版积分规则