[STM32F4] 使用STM32F4做主控、A5驱动控制交流伺服电机

[复制链接]
358|2
 楼主| caoyunhj2301 发表于 2022-11-10 15:17 | 显示全部楼层 |阅读模式
  选用定时器的主从模式,TIM2为主,TIM4为从。TIM2 输出PWM,TIM4记录脉冲数;选用PA3做为方向控制接线引脚。
watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBARERESFVBTkdK,size_20,color_FFFFFF,t_70,g_se,x_16.jpg
  关键代码如下:
  1. //定时器2主模式,定时器4从模式
  2. //PWM输出
  3. /*设置PA3引脚,使用PA3作为方向控制信号的控制脚*/
  4. void DIR_config(void)
  5. {
  6.     GPIO_InitTypeDef GPIO_InitStructure;//GPIO设置,创建结构体
  7.     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);

  8.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;       //控制电机运动方向
  9.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  10.         GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
  11.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  12.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       
  13.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  14.         GPIO_SetBits(GPIOA,GPIO_Pin_3);

  15. }

  16. /*打开定时器2,并把TIM2设定为主定时器,*/
  17. void TIM2_config(void)
  18. {
  19.     GPIO_InitTypeDef GPIO_InitStructure;//GPIO设置,创建结构体
  20.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;//定时器设置结构体
  21.     TIM_OCInitTypeDef  TIM_OCInitStructure; //pwm波对应设置结构体
  22.        
  23.     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
  24.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
  25.    
  26.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //TIM_CH1和T
  27.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  28.         GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
  29.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;             //复用推挽输出
  30.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  31.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  32.     GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_TIM2);
  33.                 //固定预分频值为5,通过改变重装载值的大小改变转速,当前转速为每分钟3000转
  34.                 //3000x3200=9600000(每分钟需要的脉冲数),9600000/60=160000(单位时间脉冲速),
  35.         //84000000/160000=525=5x105;       
  36.     TIM_TimeBaseStructure.TIM_Period = Speed-1;                                                   
  37.     TIM_TimeBaseStructure.TIM_Prescaler =(5-1);  //设置用来作为TIMx时钟//频率除数的预分频值                                                     
  38.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//设置时钟分割:TDTS= Tck_tim            
  39.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
  40.                 TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;  
  41.     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);                                       

  42.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//选择定时器模式:TIM脉冲宽度调制模式1      
  43.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  44.     TIM_OCInitStructure.TIM_Pulse = 0;                    //设置待装入捕获寄存器的脉冲值                                   
  45.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;      //输出极性         
  46.         TIM_CtrlPWMOutputs(TIM2, ENABLE);
  47.                
  48.     TIM_OC3Init(TIM2, &TIM_OCInitStructure);   //通道      
  49.     TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);
  50.     TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);
  51.    
  52.     TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);                              
  53.     TIM_ARRPreloadConfig(TIM2, ENABLE);  

  54.     TIM_Cmd(TIM2, ENABLE);
  55. }

  56. /***定时器4从模式***/
  57. void TIM4_config(void)
  58. {
  59.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;//TIMx初始化结构体
  60.     NVIC_InitTypeDef NVIC_InitStructure; //NVIC结构体
  61.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);

  62.     TIM_TimeBaseStructure.TIM_Period = 3200-1; //设置自动重装载周期值
  63.     TIM_TimeBaseStructure.TIM_Prescaler =0;   
  64.     TIM_TimeBaseStructure.TIM_ClockDivision = 0;     
  65.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  66.     TIM_TimeBaseStructure.TIM_RepetitionCounter=0;//tim1必须加这句不然没反应
  67.     TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);   //      
  68.    

  69.         TIM_SelectInputTrigger(TIM4, TIM_TS_ITR1); //对应上面的定时器主从匹配表
  70.     TIM4->SMCR|=0x07;                                  //设置从模式寄存器        
  71.     TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);

  72.     NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;        
  73.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  74.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;     
  75.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  76.     NVIC_Init(&NVIC_InitStructure);

  77.         IM_Cmd(TIM4,ENABLE);
  78.    
  79. }
  80. //每完成一个设定周期(3200)进入中断,在在中断里进行相应的操作
  81. void TIM4_IRQHandler(void)
  82. {
  83.     if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)     // TIM_IT_CC1
  84.     {
  85.                        
  86.                          TIM_ClearITPendingBit(TIM4, TIM_IT_Update); // 清除中断标志位
  87.                          TIM_SetCounter(TIM4,0);
  88.                          Now_Turns++;                                 //旋转圈数加一
  89.                          LCD_ShowxNum(130,200,Now_Turns,4,24,0); //显示在LCD屏上
  90.                         if(Now_Turns%2==1)
  91.                         {
  92. //                                beep();        //测试用                                               
  93.                         }
  94.                         if(Now_Turns%2==0)
  95.                         {
  96. //                                Shine_LED();        //测试用
  97.                         }
  98.                         if(Now_Turns>=Target_Turns)
  99.                         {
  100.                                 Run_Flag=1;
  101.                                 TIM_CtrlPWMOutputs(TIM2, DISABLE);  //主输出失能
  102.                                 TIM_Cmd(TIM2, DISABLE); // 关闭定时器
  103.                                 TIM_Cmd(TIM4, DISABLE); // 关闭定时器
  104.                                 TIM_ITConfig(TIM4, TIM_IT_Update, DISABLE); //关闭  
  105.                        
  106.                         }               
  107.                        
  108.     }
  109. }




 楼主| caoyunhj2301 发表于 2022-11-10 15:24 | 显示全部楼层
A5驱动器的关键引脚接线
79568636ca739ded47.png
 楼主| caoyunhj2301 发表于 2022-11-10 15:26 | 显示全部楼层
光耦电路图
20063636ca747cab61.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

39

主题

298

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部