找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 14268|回复: 22
收起左侧

基于STM32简易电机伺服控制器源码

  [复制链接]
ID:228912 发表于 2017-8-23 10:57 | 显示全部楼层 |阅读模式
简单电机伺服控制器实例全在压缩包里,超级实用

STM32单片机源程序如下:
  1. #include "BSP.h"
  2. /*****************************************
  3. Author     :JasonLin
  4. Version           :V2.0                         Ownership-Reserved
  5. Description:MCIO Board support package  
  6. *****************************************/
  7. void NVIC_Configuration(void)
  8. {
  9.   NVIC_InitTypeDef NVIC_InitStructure;

  10.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断分组2 两位抢占(0-3)  两位响应(0-3)=

  11.         
  12.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel3_IRQn;
  13.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  14.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  15.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  16.   NVIC_Init(&NVIC_InitStructure);

  17.   
  18.         ///////////////////////////////////////CAN                        0 1
  19.         
  20.         
  21.         NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;                  
  22.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  23.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  24.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  25.   NVIC_Init(&NVIC_InitStructure);

  26.   //*****************************************************

  27.   NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;                  
  28.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  29.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  30.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  31.   NVIC_Init(&NVIC_InitStructure);

  32.   //******************************************************

  33.   NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;                  
  34.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  35.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  36.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  37.   NVIC_Init(&NVIC_InitStructure);

  38.   //*******************************************************

  39.   NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;                  
  40.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  41.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  42.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  43.   NVIC_Init(&NVIC_InitStructure);

  44.         //*******************************************************

  45.   NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;         
  46.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
  47.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  48.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  49.   NVIC_Init(&NVIC_InitStructure);

  50.   //*******************************************************

  51.   NVIC_InitStructure.NVIC_IRQChannel = TIM7_IRQn;         
  52.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  53.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  54.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  55.   NVIC_Init(&NVIC_InitStructure);

  56.         


  57. /*优先级分组:优先级分组是为了给抢占式优先级和响应优先级在中断优先级寄存器的高四位分配各自所占的位数
  58.                在同一个程序中优先级分组只能设定一次 */

  59. /*抢占优先级: 当一个中断正在执行而另一个具有更高抢占优先级的中断到来时,抢占优先级高的就会抢占CPU处理权
  60.                                   此时两个中断就属于嵌套中断关系,具有相同抢占优先级的中断没有嵌套关系*/

  61. /*响应优先级:即副优先级,当两个抢占优先级相同的中断同时到来,具有响应优先级高的中断优先获得CPU的处理权
  62.                如果中断不是同时到来,则后来的要等待正在执行的中断处理完才能获得响应*/

  63. }


  64. ///////////////////定时器功能初始化

  65. void TIM1_Configuration(void)//TIM1四通道分别输出PWM1/PWM2/PWM3/PWM4,对应引脚为PA8/PA9/PA10/PA11
  66. {
  67.   GPIO_InitTypeDef GPIO_InitStructure;
  68.   TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  69.   TIM_OCInitTypeDef TIM_OCInitStructure;
  70.         
  71.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  72.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
  73.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

  74.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;   
  75.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;      
  76.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //复用满负载输出为3.3V      
  77.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  78.    
  79.         TIM_TimeBaseStructure.TIM_Prescaler = 0;
  80.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  81.         TIM_TimeBaseStructure.TIM_Period = PWMPeriod;
  82.         TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  83.         TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
  84.         TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
  85.         
  86.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  87.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  88.         TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
  89.   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
  90.         TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
  91.         TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  92.         TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;

  93.         TIM_OC1Init(TIM1, &TIM_OCInitStructure);
  94.         TIM_OC2Init(TIM1, &TIM_OCInitStructure);
  95.         TIM_OC3Init(TIM1, &TIM_OCInitStructure);
  96.         TIM_OC4Init(TIM1, &TIM_OCInitStructure);
  97.         
  98.         TIM1->CCR1 = 3600;
  99.         TIM1->CCR2 = 3600;  
  100.         TIM1->CCR3 = 3600;  
  101.         TIM1->CCR4 = 3600;

  102.         TIM_Cmd(TIM1, ENABLE);
  103.         TIM_CtrlPWMOutputs(TIM1, ENABLE);
  104.         
  105. }
  106. ////////////////////////////

  107. void TIM8_Configuration(void)//TIM8四通道分别输出PWM1/PWM2/PWM3/PWM4,对应引脚为PC6/PC7/PC8/PC9
  108. {
  109.         GPIO_InitTypeDef GPIO_InitStructure;
  110.   TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  111.   TIM_OCInitTypeDef TIM_OCInitStructure;

  112.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  113.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);
  114.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

  115.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;   
  116.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;      
  117.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;      
  118.   GPIO_Init(GPIOC, &GPIO_InitStructure);
  119.            
  120.         TIM_TimeBaseStructure.TIM_Prescaler = 0;
  121.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  122.         TIM_TimeBaseStructure.TIM_Period = PWMPeriod;
  123.         TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  124.         TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
  125.         TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);
  126.         
  127.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  128.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  129.         TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
  130.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
  131.         TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
  132.         TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  133.         TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;

  134.         TIM_OC1Init(TIM8, &TIM_OCInitStructure);
  135.         TIM_OC2Init(TIM8, &TIM_OCInitStructure);
  136.         TIM_OC3Init(TIM8, &TIM_OCInitStructure);
  137.         TIM_OC4Init(TIM8, &TIM_OCInitStructure);
  138.         
  139.         TIM8->CCR1 = 3600;   
  140.         TIM8->CCR2 = 3600;
  141.         TIM8->CCR3 = 3600;
  142.         TIM8->CCR4 = 3600;

  143.         TIM_Cmd(TIM8, ENABLE);
  144.         TIM_CtrlPWMOutputs(TIM8, ENABLE);        

  145. }

  146. /////////////////////////////

  147. void TIM2_Configuration(void)//编码器接口设置(TIM2)/PA15-A相  PB3-B相
  148. {
  149.   GPIO_InitTypeDef GPIO_InitStructure;
  150.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  151.         TIM_ICInitTypeDef  TIM_ICInitStructure;

  152.         //GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);  //关闭JTAG接口
  153.         GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);  //关闭JTAG接口 开启SWD

  154.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
  155.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
  156.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  157.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

  158.         GPIO_PinRemapConfig(GPIO_FullRemap_TIM2,ENABLE);       //TIM2引脚重定向
  159.                                                                                              
  160.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;                           //PA15
  161.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;         
  162.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;           
  163.         GPIO_Init(GPIOA, &GPIO_InitStructure);                                 
  164.         GPIO_WriteBit(GPIOA, GPIO_Pin_15,Bit_SET);

  165.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;                           //PB3
  166.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;         
  167.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;           
  168.         GPIO_Init(GPIOB, &GPIO_InitStructure);                                   
  169.         GPIO_WriteBit(GPIOB, GPIO_Pin_3,Bit_SET);
  170.         
  171.   TIM_TimeBaseStructure.TIM_Period = ECDPeriod; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  172.         TIM_TimeBaseStructure.TIM_Prescaler = 0; //设置用来作为TIMx时钟频率除数的预分频值  不分频
  173.         TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  174.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  175.         TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  176.         
  177.         //设置定时器2为编码器模式  IT1 IT2为上升沿计数
  178.         TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12,TIM_ICPolarity_BothEdge,TIM_ICPolarity_BothEdge);
  179.         TIM_ICStructInit(&TIM_ICInitStructure);
  180.   TIM_ICInitStructure.TIM_ICFilter = 6;  //输入滤波器
  181.   TIM_ICInit(TIM2, &TIM_ICInitStructure);
  182.   TIM_ClearFlag(TIM2, TIM_FLAG_Update);  //清除所有标志位
  183.   TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //允许中断更新
  184.   TIM2->CNT = 0;
  185.         TIM_Cmd(TIM2, ENABLE);
  186. }

  187. ///////////////////////////

  188. void TIM3_Configuration(void)//编码器接口设置(TIM3)/PA6-A相  PA7-B相
  189. {
  190.   GPIO_InitTypeDef GPIO_InitStructure;
  191.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  192.         TIM_ICInitTypeDef  TIM_ICInitStructure;
  193.         
  194.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
  195.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  196.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);  //使能GPIOA外设时钟
  197.                                                                                                
  198.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
  199.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;          //设置为上拉输入模式
  200.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;           //IO口的速率为50M
  201.         GPIO_Init(GPIOA, &GPIO_InitStructure);                                   //IO口配置函数
  202.         GPIO_WriteBit(GPIOA, GPIO_Pin_6,Bit_SET);
  203.         GPIO_WriteBit(GPIOA, GPIO_Pin_7,Bit_SET);

  204.   TIM_TimeBaseStructure.TIM_Period = ECDPeriod; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  205.         TIM_TimeBaseStructure.TIM_Prescaler = 0; //设置用来作为TIMx时钟频率除数的预分频值  不分频
  206.         TIM_TimeBaseStructure.TIM_ClockDivision = 0;     //设置时钟分割
  207.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  208.         TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  209.         
  210.         //设置定时器3为编码器模式  IT1 IT2为上升沿计数
  211.         TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12,TIM_ICPolarity_BothEdge,TIM_ICPolarity_BothEdge);
  212.         TIM_ICStructInit(&TIM_ICInitStructure);
  213.   TIM_ICInitStructure.TIM_ICFilter = 6;      //输入滤波器
  214.   TIM_ICInit(TIM3, &TIM_ICInitStructure);
  215.   TIM_ClearFlag(TIM3, TIM_FLAG_Update);      //清除所有标志位
  216.   TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); //允许中断更新
  217.   TIM3->CNT = 0;
  218.         TIM_Cmd(TIM3, ENABLE);
  219. }

  220. ///////////////////////////

  221. void TIM4_Configuration(void)//编码器接口设置(TIM4)/PB6-A相  PB7-B相
  222. {
  223.   GPIO_InitTypeDef GPIO_InitStructure;
  224.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  225.         TIM_ICInitTypeDef  TIM_ICInitStructure;
  226.         
  227.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
  228.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
  229.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);  //使能GPIOB外设时钟
  230.                                                                                                
  231.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
  232.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;          //设置为上拉输入模式
  233.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;           //IO口的速率为50M
  234.         GPIO_Init(GPIOB, &GPIO_InitStructure);                                   //IO口配置函数
  235.         GPIO_WriteBit(GPIOB, GPIO_Pin_6,Bit_SET);
  236.         GPIO_WriteBit(GPIOB, GPIO_Pin_7,Bit_SET);

  237.   TIM_TimeBaseStructure.TIM_Period = ECDPeriod;
  238.         TIM_TimeBaseStructure.TIM_Prescaler = 0;
  239.         TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  240.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  241.         TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
  242.         
  243.         //设置定时器3为编码器模式  IT1 IT2为上升沿计数
  244.         TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12,TIM_ICPolarity_BothEdge,TIM_ICPolarity_BothEdge);
  245.         TIM_ICStructInit(&TIM_ICInitStructure);
  246.   TIM_ICInitStructure.TIM_ICFilter = 6;      //输入滤波器
  247.   TIM_ICInit(TIM4, &TIM_ICInitStructure);
  248.   TIM_ClearFlag(TIM4, TIM_FLAG_Update);      //清除所有标志位
  249.   TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); //允许中断更新
  250.   TIM4->CNT = 0;
  251.         TIM_Cmd(TIM4, ENABLE);
  252. }

  253. ///////////////////////////

  254. void TIM5_Configuration(void)//编码器接口设置(TIM5)/PA0-A相  PA1-B相
  255. {
  256.   GPIO_InitTypeDef GPIO_InitStructure;
  257.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  258.         TIM_ICInitTypeDef  TIM_ICInitStructure;
  259.         
  260.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
  261.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
  262.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
  263.                                                                                                
  264.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
  265.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;         
  266.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         
  267.         GPIO_Init(GPIOA, &GPIO_InitStructure);                                 
  268.         GPIO_WriteBit(GPIOA, GPIO_Pin_0,Bit_SET);
  269.         GPIO_WriteBit(GPIOA, GPIO_Pin_1,Bit_SET);

  270.   TIM_TimeBaseStructure.TIM_Period = ECDPeriod;
  271.         TIM_TimeBaseStructure.TIM_Prescaler = 0;
  272.         TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  273.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  274.         TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);
  275.         
  276.         //设置定时器3为编码器模式  IT1 IT2为上升沿计数
  277.         TIM_EncoderInterfaceConfig(TIM5, TIM_EncoderMode_TI12,TIM_ICPolarity_BothEdge,TIM_ICPolarity_BothEdge);
  278.         TIM_ICStructInit(&TIM_ICInitStructure);
  279.   TIM_ICInitStructure.TIM_ICFilter = 6;  
  280.   TIM_ICInit(TIM5, &TIM_ICInitStructure);
  281.   TIM_ClearFlag(TIM5, TIM_FLAG_Update);
  282.   TIM_ITConfig(TIM5, TIM_IT_Update, ENABLE);
  283.   TIM5->CNT = 0;
  284.         TIM_Cmd(TIM5, ENABLE);
  285. }

  286. /////////////////////

  287. void TIM6_Configuration(void)//周期循环事件定时初始化
  288. {
  289.   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  290.    
  291.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);

  292.   TIM_TimeBaseStructure.TIM_Period = TIMPeriod-1;
  293.   TIM_TimeBaseStructure.TIM_Prescaler =72-1;
  294.   TIM_TimeBaseStructure.TIM_ClockDivision = 0;      
  295.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  296.   TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
  297.   TIM_TimeBaseInit(TIM6,&TIM_TimeBaseStructure);
  298.    
  299.   TIM_UpdateRequestConfig(TIM6,TIM_UpdateSource_Regular);
  300.   TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);
  301.   TIM_Cmd(TIM6,ENABLE);

  302. }
  303. ////////////////////

  304. void TIM7_Configuration(void)//周期循环事件定时初始化
  305. {
  306.   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  307.    
  308.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE);

  309.   TIM_TimeBaseStructure.TIM_Period = TIMPeriod-1;
  310.   TIM_TimeBaseStructure.TIM_Prescaler =72-1;
  311.   TIM_TimeBaseStructure.TIM_ClockDivision = 0;      
  312.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  313.   TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
  314.   TIM_TimeBaseInit(TIM7,&TIM_TimeBaseStructure);
  315.    
  316.   TIM_UpdateRequestConfig(TIM7,TIM_UpdateSource_Regular);
  317.   TIM_ITConfig(TIM7,TIM_IT_Update,ENABLE);
  318.   TIM_Cmd(TIM7,ENABLE);

  319. }

  320. //////////////////////////

  321. void TIM_Configuration(void)//TIM初始化
  322. {
  323.   TIM1_Configuration();
  324.         TIM8_Configuration();
  325.         TIM2_Configuration();
  326.         TIM3_Configuration();
  327.         TIM4_Configuration();
  328.         TIM5_Configuration();
  329.         TIM6_Configuration();
  330.         TIM7_Configuration();
  331.         
  332. }

  333. ///////////////////////电机速度写入接口
  334.   
  335. void MotorSpeedSetOne(s32 MotorSpeed)//电机1转速/转向设置(TIM1)
  336. {               
  337.         s32 PwmOne_Set,PwmOne_Mode;

  338.         if(MotorSpeed > PWMPeriod-PWMLOSS)    MotorSpeed =   PWMPeriod-PWMLOSS ;//上限 CCR的值必须小于或等于ARR的值
  339.         if(MotorSpeed <-(PWMPeriod-PWMLOSS))  MotorSpeed = -(PWMPeriod-PWMLOSS);//下限

  340.         if(MotorSpeed<0) { PwmOne_Set = -MotorSpeed; PwmOne_Mode = MotorOneBack;}
  341.         else { PwmOne_Set = MotorSpeed; PwmOne_Mode = MotorOneForward;}
  342.         
  343.         if(PwmOne_Mode) {TIM1->CCR1 = MotorSpdZero; TIM1->CCR2 = PwmOne_Set;} //MotorOneForward
  344.         else { TIM1->CCR1 = PwmOne_Set; TIM1->CCR2 = MotorSpdZero;} //MotorOneBack        
  345. }

  346. ////////////////////////////////

  347. void MotorSpeedSetTwo(s32 MotorSpeed)//电机2转速/转向设置(TIM1)
  348. {
  349.   s32 PwmTwo_Set,PwmTwo_Mode;

  350.   if(MotorSpeed > PWMPeriod-PWMLOSS)    MotorSpeed =   PWMPeriod-PWMLOSS ;//上限 CCR的值必须小于或等于ARR的值
  351.   if(MotorSpeed <-(PWMPeriod-PWMLOSS))  MotorSpeed = -(PWMPeriod-PWMLOSS);//下限

  352.   if(MotorSpeed<0) { PwmTwo_Set = -MotorSpeed; PwmTwo_Mode = MotorTwoBack;}
  353.   else { PwmTwo_Set = MotorSpeed; PwmTwo_Mode = MotorTwoForward;}

  354.   if(PwmTwo_Mode) {TIM1->CCR3 = MotorSpdZero; TIM1->CCR4 = PwmTwo_Set;} //MotorTwoForward
  355.   else { TIM1->CCR3 = PwmTwo_Set; TIM1->CCR4 = MotorSpdZero;}        //MotorTwoBack
  356. }

  357. ////////////////////////////////

  358. void MotorSpeedSetThr(s32 MotorSpeed)//电机3转速/转向设置(TIM8)
  359. {               
  360.         s32 PwmOne_Set,PwmOne_Mode;

  361.         if(MotorSpeed > PWMPeriod-PWMLOSS)    MotorSpeed =   PWMPeriod-PWMLOSS ;//上限 CCR的值必须小于或等于ARR的值
  362.         if(MotorSpeed <-(PWMPeriod-PWMLOSS))  MotorSpeed = -(PWMPeriod-PWMLOSS);//下限

  363.         if(MotorSpeed<0) { PwmOne_Set = -MotorSpeed; PwmOne_Mode = MotorOneBack;}
  364.         else { PwmOne_Set = MotorSpeed; PwmOne_Mode = MotorOneForward;}

  365.         if(PwmOne_Mode) {TIM8->CCR1 = MotorSpdZero; TIM8->CCR2 = PwmOne_Set;} //MotorOneForward
  366.         else { TIM8->CCR1 = PwmOne_Set; TIM8->CCR2 = MotorSpdZero;} //MotorOneBack        
  367. }

  368. ////////////////////////////////

  369. void MotorSpeedSetFou(s32 MotorSpeed)//电机4转速/转向设置(TIM8)
  370. {
  371.   s32 PwmTwo_Set,PwmTwo_Mode;

  372.   if(MotorSpeed > PWMPeriod-PWMLOSS)    MotorSpeed =   PWMPeriod-PWMLOSS ;//上限 CCR的值必须小于或等于ARR的值
  373.   if(MotorSpeed <-(PWMPeriod-PWMLOSS))  MotorSpeed = -(PWMPeriod-PWMLOSS);//下限

  374.   if(MotorSpeed<0) { PwmTwo_Set = -MotorSpeed; PwmTwo_Mode = MotorTwoBack;}
  375.   else { PwmTwo_Set = MotorSpeed; PwmTwo_Mode = MotorTwoForward;}

  376.   if(PwmTwo_Mode) {TIM8->CCR3 = MotorSpdZero; TIM8->CCR4 = PwmTwo_Set;} //MotorTwoForward
  377.   else { TIM8->CCR3 = PwmTwo_Set; TIM8->CCR4 = MotorSpdZero;}        //MotorTwoBack
  378. }


  379. ///////////LED 初始化

  380. void Led_Configuration(void)
  381. {
  382.   GPIO_InitTypeDef  GPIO_InitStructure;        
  383.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);                 
  384.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15|GPIO_Pin_14|GPIO_Pin_13;                                
  385.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 
  386.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 
  387.   GPIO_Init(GPIOB, &GPIO_InitStructure);                                
  388.   GPIO_ResetBits(GPIOB,GPIO_Pin_15);                                       
  389.   GPIO_ResetBits(GPIOB,GPIO_Pin_14);
  390.   GPIO_ResetBits(GPIOB,GPIO_Pin_13);
  391. }

  392. //////SYSTICK 初始化

  393. void Systick_Configuration(void)
  394. {
  395.   SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);        //选择外部时钟  HCLK/8        9M
  396. }

  397. //////延时写入接口

  398. void SysDelay_ms(u16 nms)//72M条件下,nms<=1864(2^24/9000)
  399. {                                    
  400.         u32 temp;                  
  401.         SysTick->LOAD=(u32)nms*Sys_ms;//时间加载(SysTick->LOAD为24bit)
  402.         SysTick->VAL =0x00;           //清空计数器
  403.         SysTick->CTRL=0x01;           //开始倒数  
  404.         do
  405.         {
  406.                 temp=SysTick->CTRL;
  407.         }
  408.         while(temp&0x01&&!(temp&(1<<16)));//等待时间到达   
  409.         SysTick->CTRL=0x00;       //关闭计数器
  410.         SysTick->VAL =0X00;       //清空计数器                     
  411. }

  412. void SysDelay_us(u32 nus)//72M条件下,nus<=2^24
  413. {               
  414.         u32 temp;                     
  415.         SysTick->LOAD=nus*Sys_us; //时间加载                           
  416.         SysTick->VAL=0x00;        //清空计数器
  417.         SysTick->CTRL=0x01;       //开始倒数         
  418.         do
  419.         {
  420.                 temp=SysTick->CTRL;
  421.         }
  422.         while(temp&0x01&&!(temp&(1<<16)));//等待时间到达   
  423.         SysTick->CTRL=0x00;       //关闭计数器
  424.         SysTick->VAL =0X00;       //清空计数器         
  425. }


  426. ///////Board Communication Package

  427. unsigned char sbus_rx_buffer[18];
  428. RC_Ctl_t RC_Ctl;

  429. void USART3_Config(void)
  430. {
  431.         GPIO_InitTypeDef GPIO_InitStructure;
  432.         USART_InitTypeDef USART_InitStructure;
  433.         
  434.         /* config USART1 clock */
  435.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3  | RCC_APB2Periph_GPIOB, ENABLE);
  436.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  437.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  438.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  439.          
  440.         /* USART3 mode config */
  441.         USART_InitStructure.USART_BaudRate = 100000;
  442.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  443.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  444.         USART_InitStructure.USART_Parity = USART_Parity_Even ;
  445.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  446.         USART_InitStructure.USART_Mode = USART_Mode_Rx ;
  447.         USART_Init(USART3, &USART_InitStructure);
  448.         USART_Cmd(USART3, ENABLE);
  449. }

  450. void DMA_Config(void)
  451. {
  452.    DMA_InitTypeDef DMA_InitStructure;

  453.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);        //开启DMA时钟

  454.          /*设置DMA源:内存地址&串口数据寄存器地址*/
  455.     DMA_InitStructure.DMA_PeripheralBaseAddr =(uint32_t)&(USART3->DR);           

  456.         /*内存地址(要传输的变量的指针)*/
  457.     DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)sbus_rx_buffer;
  458.         
  459.         /*方向:从外设到内存*/               
  460.     DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC ;        
  461.         
  462.         /*传输大小DMA_BufferSize=SENDBUFF_SIZE*/        
  463.     DMA_InitStructure.DMA_BufferSize = 18;
  464.         
  465.         /*外设地址不增*/            
  466.     DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  467.         
  468.         /*内存地址自增*/
  469.     DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;        
  470.         
  471.         /*外设数据单位*/        
  472.     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  473.         
  474.         /*内存数据单位 8bit*/
  475.     DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;         
  476.         
  477.         /*DMA模式:循环*/
  478.     DMA_InitStructure.DMA_Mode = DMA_Mode_Circular ;         
  479.         
  480.         /*优先级:非常高*/        
  481.     DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;  
  482.         
  483.         /*禁止内存到内存的传输        */
  484.     DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  485.         
  486.         /*配置DMA1的3通道*/                  
  487.     DMA_Init(DMA1_Channel3, &DMA_InitStructure);            
  488.         
  489.         DMA_Cmd (DMA1_Channel3,ENABLE);                                        //使能DMA
  490.         DMA_ITConfig(DMA1_Channel3,DMA_IT_TC,ENABLE);  //配置DMA发送完成后产生中断

  491. }



  492. //////Board Support Package

  493. void BSP_Configuration(void)
  494. {
  495.   NVIC_Configuration();
  496.   TIM_Configuration();
  497.   Led_Configuration();
  498.         Systick_Configuration();
  499.         USART3_Config();
  500.         DMA_Config();
  501.         USART_DMACmd(USART3, USART_DMAReq_Rx, ENABLE);

  502. }







  503. ///////////编码器读取

  504. EncoderType GetEncoder;

  505. void Get_Encoder_ONE(void)
  506. {
  507.   s32 CNT2_temp,CNT2_last;
  508.   
  509.   GetEncoder.cnt2 = TIM2 -> CNT;
  510.   CNT2_last = GetEncoder.CNT2;
  511.   CNT2_temp = GetEncoder.rcnt2 * prd + GetEncoder.cnt2;  
  512.   GetEncoder.V2 = CNT2_temp - CNT2_last;               
  513.   
  514.   while ((s32)(GetEncoder.V2)>Vbreak)                                 
  515.   {                                                              
  516.    GetEncoder.rcnt2--;                                             
  517.    CNT2_temp = GetEncoder.rcnt2 * prd + GetEncoder.cnt2;
  518.    GetEncoder.V2 = CNT2_temp - CNT2_last;                 
  519.   }                                                            
  520.   while ((s32)(GetEncoder.V2)<-Vbreak)                           
  521.   {                                                              
  522.    GetEncoder.rcnt2++;                                             
  523.    CNT2_temp = GetEncoder.rcnt2 * prd + GetEncoder.cnt2;
  524.    GetEncoder.V2 = CNT2_temp - CNT2_last;                 
  525.   }
  526.   GetEncoder.CNT2 = CNT2_temp;                                                
  527.   
  528. }

  529. ///////////////////

  530. void Get_Encoder_TWO(void)
  531. {
  532.   s32 CNT3_temp,CNT3_last;

  533.   GetEncoder.cnt3 = TIM3 -> CNT;
  534.   CNT3_last = GetEncoder.CNT3;
  535.   CNT3_temp = GetEncoder.rcnt3 * prd + GetEncoder.cnt3;
  536.   GetEncoder.V3 = CNT3_temp - CNT3_last;               
  537.   
  538.   while ((s32)(GetEncoder.V3)>Vbreak)                                 
  539.   {                                                              
  540.    GetEncoder.rcnt3--;                                             
  541.    CNT3_temp = GetEncoder.rcnt3 * prd + GetEncoder.cnt3;
  542.    GetEncoder.V3 = CNT3_temp - CNT3_last;                 
  543.   }                                                            
  544.   while ((s32)(GetEncoder.V3)<-Vbreak)                           
  545.   {                                                              
  546.    GetEncoder.rcnt3++;                                             
  547.    CNT3_temp = GetEncoder.rcnt3 * prd + GetEncoder.cnt3;
  548.    GetEncoder.V3 = CNT3_temp - CNT3_last;                 
  549.   }
  550.   GetEncoder.CNT3 = CNT3_temp;                                                
  551.   
  552. ……………………

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

所有资料51hei提供下载:
基于STM32简易电机伺服控制器.rar (298.89 KB, 下载次数: 283)
回复

使用道具 举报

ID:280232 发表于 2018-1-27 16:55 | 显示全部楼层
这个控制源码有实际应用过吗?
回复

使用道具 举报

ID:280232 发表于 2018-1-27 16:56 | 显示全部楼层
代码实用过吗?
回复

使用道具 举报

ID:235925 发表于 2018-3-5 13:43 | 显示全部楼层
不错很好,棒
回复

使用道具 举报

ID:272408 发表于 2018-4-1 21:26 | 显示全部楼层
牛x,好用吗
回复

使用道具 举报

ID:272408 发表于 2018-4-1 21:26 | 显示全部楼层
不错不错
回复

使用道具 举报

ID:272408 发表于 2018-4-1 21:54 | 显示全部楼层
正需要
回复

使用道具 举报

ID:326092 发表于 2018-5-9 17:08 | 显示全部楼层
有人用过吗???
回复

使用道具 举报

ID:316065 发表于 2018-5-24 15:50 | 显示全部楼层
代码用过吗
回复

使用道具 举报

ID:340951 发表于 2018-5-29 22:10 | 显示全部楼层
有电气原理图吗
回复

使用道具 举报

ID:389751 发表于 2018-10-17 16:42 | 显示全部楼层
谢谢分享~~~~
回复

使用道具 举报

ID:460567 发表于 2019-1-3 06:56 来自手机 | 显示全部楼层
有电机和单片机的接线原理图吗?
回复

使用道具 举报

ID:519948 发表于 2019-4-23 21:00 | 显示全部楼层
不错,刚好需要
回复

使用道具 举报

ID:522830 发表于 2019-4-27 11:45 | 显示全部楼层
谢谢提供
回复

使用道具 举报

ID:107984 发表于 2019-6-19 12:10 | 显示全部楼层
谢谢楼主奉献!
回复

使用道具 举报

ID:557241 发表于 2019-6-25 17:46 | 显示全部楼层
有电路连接图吗
回复

使用道具 举报

ID:321962 发表于 2019-9-29 18:13 | 显示全部楼层
下载看看
回复

使用道具 举报

ID:122260 发表于 2020-3-20 20:19 | 显示全部楼层
怎么接线啊
回复

使用道具 举报

ID:274685 发表于 2020-5-22 09:21 | 显示全部楼层
没参考价值,什么说明都没有,
回复

使用道具 举报

ID:829601 发表于 2020-10-14 09:10 | 显示全部楼层
有人测试过有效吗
回复

使用道具 举报

ID:829601 发表于 2020-10-14 09:10 | 显示全部楼层
请问针对的是哪个型号的伺服啊
回复

使用道具 举报

ID:228452 发表于 2022-4-5 05:48 | 显示全部楼层
No schematics ?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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