久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 15059|回復(fù): 22
收起左側(cè)

基于STM32簡易電機(jī)伺服控制器源碼

  [復(fù)制鏈接]
ID:228912 發(fā)表于 2017-8-23 10:57 | 顯示全部樓層 |閱讀模式
簡單電機(jī)伺服控制器實(shí)例全在壓縮包里,超級(jí)實(shí)用

STM32單片機(jī)源程序如下:
  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)  兩位響應(yīng)(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. /*優(yōu)先級(jí)分組:優(yōu)先級(jí)分組是為了給搶占式優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)在中斷優(yōu)先級(jí)寄存器的高四位分配各自所占的位數(shù)
  58.                在同一個(gè)程序中優(yōu)先級(jí)分組只能設(shè)定一次 */

  59. /*搶占優(yōu)先級(jí): 當(dāng)一個(gè)中斷正在執(zhí)行而另一個(gè)具有更高搶占優(yōu)先級(jí)的中斷到來時(shí),搶占優(yōu)先級(jí)高的就會(huì)搶占CPU處理權(quán)
  60.                                   此時(shí)兩個(gè)中斷就屬于嵌套中斷關(guān)系,具有相同搶占優(yōu)先級(jí)的中斷沒有嵌套關(guān)系*/

  61. /*響應(yīng)優(yōu)先級(jí):即副優(yōu)先級(jí),當(dāng)兩個(gè)搶占優(yōu)先級(jí)相同的中斷同時(shí)到來,具有響應(yīng)優(yōu)先級(jí)高的中斷優(yōu)先獲得CPU的處理權(quán)
  62.                如果中斷不是同時(shí)到來,則后來的要等待正在執(zhí)行的中斷處理完才能獲得響應(yīng)*/

  63. }


  64. ///////////////////定時(shí)器功能初始化

  65. void TIM1_Configuration(void)//TIM1四通道分別輸出PWM1/PWM2/PWM3/PWM4,對(duì)應(yīng)引腳為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;   //復(fù)用滿負(fù)載輸出為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,對(duì)應(yīng)引腳為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)//編碼器接口設(shè)置(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);  //關(guān)閉JTAG接口
  153.         GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);  //關(guān)閉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; //設(shè)置在下一個(gè)更新事件裝入活動(dòng)的自動(dòng)重裝載寄存器周期的值
  172.         TIM_TimeBaseStructure.TIM_Prescaler = 0; //設(shè)置用來作為TIMx時(shí)鐘頻率除數(shù)的預(yù)分頻值  不分頻
  173.         TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設(shè)置時(shí)鐘分割:TDTS = Tck_tim
  174.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計(jì)數(shù)模式
  175.         TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  176.         
  177.         //設(shè)置定時(shí)器2為編碼器模式  IT1 IT2為上升沿計(jì)數(shù)
  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);  //清除所有標(biāo)志位
  183.   TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //允許中斷更新
  184.   TIM2->CNT = 0;
  185.         TIM_Cmd(TIM2, ENABLE);
  186. }

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

  188. void TIM3_Configuration(void)//編碼器接口設(shè)置(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外設(shè)時(shí)鐘
  197.                                                                                                
  198.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
  199.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;          //設(shè)置為上拉輸入模式
  200.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;           //IO口的速率為50M
  201.         GPIO_Init(GPIOA, &GPIO_InitStructure);                                   //IO口配置函數(shù)
  202.         GPIO_WriteBit(GPIOA, GPIO_Pin_6,Bit_SET);
  203.         GPIO_WriteBit(GPIOA, GPIO_Pin_7,Bit_SET);

  204.   TIM_TimeBaseStructure.TIM_Period = ECDPeriod; //設(shè)置在下一個(gè)更新事件裝入活動(dòng)的自動(dòng)重裝載寄存器周期的值
  205.         TIM_TimeBaseStructure.TIM_Prescaler = 0; //設(shè)置用來作為TIMx時(shí)鐘頻率除數(shù)的預(yù)分頻值  不分頻
  206.         TIM_TimeBaseStructure.TIM_ClockDivision = 0;     //設(shè)置時(shí)鐘分割
  207.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計(jì)數(shù)模式
  208.         TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  209.         
  210.         //設(shè)置定時(shí)器3為編碼器模式  IT1 IT2為上升沿計(jì)數(shù)
  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);      //清除所有標(biāo)志位
  216.   TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); //允許中斷更新
  217.   TIM3->CNT = 0;
  218.         TIM_Cmd(TIM3, ENABLE);
  219. }

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

  221. void TIM4_Configuration(void)//編碼器接口設(shè)置(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外設(shè)時(shí)鐘
  230.                                                                                                
  231.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
  232.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;          //設(shè)置為上拉輸入模式
  233.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;           //IO口的速率為50M
  234.         GPIO_Init(GPIOB, &GPIO_InitStructure);                                   //IO口配置函數(shù)
  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.         //設(shè)置定時(shí)器3為編碼器模式  IT1 IT2為上升沿計(jì)數(shù)
  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);      //清除所有標(biāo)志位
  249.   TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); //允許中斷更新
  250.   TIM4->CNT = 0;
  251.         TIM_Cmd(TIM4, ENABLE);
  252. }

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

  254. void TIM5_Configuration(void)//編碼器接口設(shè)置(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.         //設(shè)置定時(shí)器3為編碼器模式  IT1 IT2為上升沿計(jì)數(shù)
  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)//周期循環(huán)事件定時(shí)初始化
  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)//周期循環(huán)事件定時(shí)初始化
  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. ///////////////////////電機(jī)速度寫入接口
  334.   
  335. void MotorSpeedSetOne(s32 MotorSpeed)//電機(jī)1轉(zhuǎn)速/轉(zhuǎn)向設(shè)置(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)//電機(jī)2轉(zhuǎn)速/轉(zhuǎn)向設(shè)置(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)//電機(jī)3轉(zhuǎn)速/轉(zhuǎn)向設(shè)置(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)//電機(jī)4轉(zhuǎn)速/轉(zhuǎn)向設(shè)置(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);        //選擇外部時(shí)鐘  HCLK/8        9M
  396. }

  397. //////延時(shí)寫入接口

  398. void SysDelay_ms(u16 nms)//72M條件下,nms<=1864(2^24/9000)
  399. {                                    
  400.         u32 temp;                  
  401.         SysTick->LOAD=(u32)nms*Sys_ms;//時(shí)間加載(SysTick->LOAD為24bit)
  402.         SysTick->VAL =0x00;           //清空計(jì)數(shù)器
  403.         SysTick->CTRL=0x01;           //開始倒數(shù)  
  404.         do
  405.         {
  406.                 temp=SysTick->CTRL;
  407.         }
  408.         while(temp&0x01&&!(temp&(1<<16)));//等待時(shí)間到達(dá)   
  409.         SysTick->CTRL=0x00;       //關(guān)閉計(jì)數(shù)器
  410.         SysTick->VAL =0X00;       //清空計(jì)數(shù)器                     
  411. }

  412. void SysDelay_us(u32 nus)//72M條件下,nus<=2^24
  413. {               
  414.         u32 temp;                     
  415.         SysTick->LOAD=nus*Sys_us; //時(shí)間加載                           
  416.         SysTick->VAL=0x00;        //清空計(jì)數(shù)器
  417.         SysTick->CTRL=0x01;       //開始倒數(shù)         
  418.         do
  419.         {
  420.                 temp=SysTick->CTRL;
  421.         }
  422.         while(temp&0x01&&!(temp&(1<<16)));//等待時(shí)間到達(dá)   
  423.         SysTick->CTRL=0x00;       //關(guān)閉計(jì)數(shù)器
  424.         SysTick->VAL =0X00;       //清空計(jì)數(shù)器         
  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時(shí)鐘

  454.          /*設(shè)置DMA源:內(nèi)存地址&串口數(shù)據(jù)寄存器地址*/
  455.     DMA_InitStructure.DMA_PeripheralBaseAddr =(uint32_t)&(USART3->DR);           

  456.         /*內(nèi)存地址(要傳輸?shù)淖兞康闹羔?*/
  457.     DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)sbus_rx_buffer;
  458.         
  459.         /*方向:從外設(shè)到內(nèi)存*/               
  460.     DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC ;        
  461.         
  462.         /*傳輸大小DMA_BufferSize=SENDBUFF_SIZE*/        
  463.     DMA_InitStructure.DMA_BufferSize = 18;
  464.         
  465.         /*外設(shè)地址不增*/            
  466.     DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  467.         
  468.         /*內(nèi)存地址自增*/
  469.     DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;        
  470.         
  471.         /*外設(shè)數(shù)據(jù)單位*/        
  472.     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  473.         
  474.         /*內(nèi)存數(shù)據(jù)單位 8bit*/
  475.     DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;         
  476.         
  477.         /*DMA模式:循環(huán)*/
  478.     DMA_InitStructure.DMA_Mode = DMA_Mode_Circular ;         
  479.         
  480.         /*優(yōu)先級(jí):非常高*/        
  481.     DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;  
  482.         
  483.         /*禁止內(nèi)存到內(nèi)存的傳輸        */
  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發(fā)送完成后產(chǎn)生中斷

  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. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
基于STM32簡易電機(jī)伺服控制器.rar (298.89 KB, 下載次數(shù): 283)


回復(fù)

使用道具 舉報(bào)

ID:280232 發(fā)表于 2018-1-27 16:55 | 顯示全部樓層
這個(gè)控制源碼有實(shí)際應(yīng)用過嗎?
回復(fù)

使用道具 舉報(bào)

ID:280232 發(fā)表于 2018-1-27 16:56 | 顯示全部樓層
代碼實(shí)用過嗎?
回復(fù)

使用道具 舉報(bào)

ID:235925 發(fā)表于 2018-3-5 13:43 | 顯示全部樓層
不錯(cuò)很好,棒
回復(fù)

使用道具 舉報(bào)

ID:272408 發(fā)表于 2018-4-1 21:26 | 顯示全部樓層
牛x,好用嗎
回復(fù)

使用道具 舉報(bào)

ID:272408 發(fā)表于 2018-4-1 21:26 | 顯示全部樓層
不錯(cuò)不錯(cuò)
回復(fù)

使用道具 舉報(bào)

ID:272408 發(fā)表于 2018-4-1 21:54 | 顯示全部樓層
正需要
回復(fù)

使用道具 舉報(bào)

ID:326092 發(fā)表于 2018-5-9 17:08 | 顯示全部樓層
有人用過嗎???
回復(fù)

使用道具 舉報(bào)

ID:316065 發(fā)表于 2018-5-24 15:50 | 顯示全部樓層
代碼用過嗎
回復(fù)

使用道具 舉報(bào)

ID:340951 發(fā)表于 2018-5-29 22:10 | 顯示全部樓層
有電氣原理圖嗎
回復(fù)

使用道具 舉報(bào)

ID:389751 發(fā)表于 2018-10-17 16:42 | 顯示全部樓層
謝謝分享~~~~
回復(fù)

使用道具 舉報(bào)

ID:460567 發(fā)表于 2019-1-3 06:56 來自手機(jī) | 顯示全部樓層
有電機(jī)和單片機(jī)的接線原理圖嗎?
回復(fù)

使用道具 舉報(bào)

ID:519948 發(fā)表于 2019-4-23 21:00 | 顯示全部樓層
不錯(cuò),剛好需要
回復(fù)

使用道具 舉報(bào)

ID:522830 發(fā)表于 2019-4-27 11:45 | 顯示全部樓層
謝謝提供
回復(fù)

使用道具 舉報(bào)

ID:107984 發(fā)表于 2019-6-19 12:10 | 顯示全部樓層
謝謝樓主奉獻(xiàn)!
回復(fù)

使用道具 舉報(bào)

ID:557241 發(fā)表于 2019-6-25 17:46 | 顯示全部樓層
有電路連接圖嗎
回復(fù)

使用道具 舉報(bào)

ID:321962 發(fā)表于 2019-9-29 18:13 | 顯示全部樓層
下載看看
回復(fù)

使用道具 舉報(bào)

ID:122260 發(fā)表于 2020-3-20 20:19 | 顯示全部樓層
怎么接線啊
回復(fù)

使用道具 舉報(bào)

ID:274685 發(fā)表于 2020-5-22 09:21 | 顯示全部樓層
沒參考價(jià)值,什么說明都沒有,
回復(fù)

使用道具 舉報(bào)

ID:829601 發(fā)表于 2020-10-14 09:10 | 顯示全部樓層
有人測(cè)試過有效嗎
回復(fù)

使用道具 舉報(bào)

ID:829601 發(fā)表于 2020-10-14 09:10 | 顯示全部樓層
請(qǐng)問針對(duì)的是哪個(gè)型號(hào)的伺服啊
回復(fù)

使用道具 舉報(bào)

ID:228452 發(fā)表于 2022-4-5 05:48 | 顯示全部樓層
No schematics ?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 黑人中文字幕一区二区三区 | 亚洲一区二区免费看 | 玖玖视频 | 99国内精品久久久久久久 | 蜜桃臀av一区二区三区 | 精品视频一区二区三区四区 | 在线免费观看毛片 | 亚洲精品视频一区二区三区 | 久久国产婷婷国产香蕉 | 狠狠热视频 | 四虎影音 | 中文字幕亚洲视频 | 色桃网| 国产高清视频一区二区 | 欧美一区二区三区在线观看 | 国产精品免费小视频 | 美女啪啪国产 | 国产一区影院 | 免费亚洲婷婷 | 精品国产伦一区二区三区观看说明 | 午夜久久久久久久久久一区二区 | 欧美激情欧美激情在线五月 | 人操人人 | 成人一区二区三区在线 | 91久久久久久久久久久 | 国产精品亚洲成在人线 | 亚洲精品在线播放 | 91精品一区二区三区久久久久 | 99成人精品| 91精品国产一区二区三区 | 视频一区在线播放 | 91精品久久久久久久久中文字幕 | 一区二区三区在线 | 国产日韩精品在线 | 亚洲444kkkk在线观看最新 | 午夜激情视频在线 | 9久久婷婷国产综合精品性色 | 欧美理论片在线观看 | 黄网站涩免费蜜桃网站 | 干干干操操操 | 中文字幕av网站 |