標(biāo)題: stm32定時器3四路PWM輸出驅(qū)動l9110s電機 源程序 [打印本頁]

作者: 卓zz    時間: 2019-7-27 01:05
標(biāo)題: stm32定時器3四路PWM輸出驅(qū)動l9110s電機 源程序
stm32驅(qū)動l9110s,定時器3四路PWM輸出,pwm范圍為-899至899,可正反轉(zhuǎn)。

單片機源程序如下:
  1. #include "L9110.h"
  2. #include "usart.h"
  3. #include "led.h"


  4. //通用定時器3中斷初始化
  5. //這里時鐘選擇為APB1的2倍,而APB1為36M
  6. //arr:自動重裝值。
  7. //psc:時鐘預(yù)分頻數(shù)
  8. //這里使用的是定時器3!
  9. void TIM3_Int_Init(u16 arr,u16 psc)
  10. {
  11.   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  12.         NVIC_InitTypeDef NVIC_InitStructure;

  13.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //時鐘使能
  14.         TIM_TimeBaseStructure.TIM_Period = arr; //設(shè)置在下一個更新事件裝入活動的自動重裝載寄存器周期的值         計數(shù)到5000為500ms
  15.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //設(shè)置用來作為TIMx時鐘頻率除數(shù)的預(yù)分頻值  10Khz的計數(shù)頻率  
  16.         TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設(shè)置時鐘分割:TDTS = Tck_tim
  17.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計數(shù)模式
  18.         TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根據(jù)TIM_TimeBaseInitStruct中指定的參數(shù)初始化TIMx的時間基數(shù)單位

  19.         TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中斷,允許更新中斷

  20.         NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中斷
  21.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占優(yōu)先級0級
  22.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //從優(yōu)先級3級
  23.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
  24.         NVIC_Init(&NVIC_InitStructure);  //根據(jù)NVIC_InitStruct中指定的參數(shù)初始化外設(shè)NVIC寄存器

  25.         TIM_Cmd(TIM3, ENABLE);  //使能TIMx外設(shè)
  26.                                                          
  27. }
  28. //定時器3中斷服務(wù)程序
  29. void TIM3_IRQHandler(void)   //TIM3中斷
  30. {
  31.         if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //檢查指定的TIM中斷發(fā)生與否:TIM 中斷源
  32.                 {
  33.                 TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中斷待處理位:TIM 中斷源
  34.                 LED1=!LED1;
  35.                 }
  36. }

  37. //TIM3 PWM部分初始化
  38. //PWM輸出初始化
  39. //arr:自動重裝值
  40. //psc:時鐘預(yù)分頻數(shù)
  41. void TIM3_PWM_Init(u16 arr,u16 psc)
  42. {  
  43.         GPIO_InitTypeDef GPIO_InitStructure;
  44.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  45.         TIM_OCInitTypeDef  TIM_OCInitStructure;
  46.         

  47.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);        //使能定時器3時鐘
  48.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  |  RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIO外設(shè)功能模塊時鐘
  49.          

  50.    //設(shè)置該引腳為復(fù)用輸出功能,輸出TIM3 CH2的PWM脈沖波形        GPIOA.6,7
  51.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; //TIM_CH2,TIM_CH1
  52.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //復(fù)用推挽輸出
  53.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  54.         GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO
  55.         
  56.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; //TIM_CH3,TIM_CH4
  57.         GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO

  58.    //初始化TIM3
  59.         TIM_TimeBaseStructure.TIM_Period = arr; //設(shè)置在下一個更新事件裝入活動的自動重裝載寄存器周期的值
  60.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //設(shè)置用來作為TIMx時鐘頻率除數(shù)的預(yù)分頻值
  61.         TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設(shè)置時鐘分割:TDTS = Tck_tim
  62.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計數(shù)模式
  63.         TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根據(jù)TIM_TimeBaseInitStruct中指定的參數(shù)初始化TIMx的時間基數(shù)單位
  64.         
  65.         //初始化TIM3 四路PWM模式         
  66.         
  67.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇定時器模式:TIM脈沖寬度調(diào)制模式1
  68.          TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
  69.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高
  70.         TIM_OC1Init(TIM3, &TIM_OCInitStructure);  //根據(jù)T指定的參數(shù)初始化外設(shè)TIM3 OC1
  71.         TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR1上的預(yù)裝載寄存器
  72.         
  73.                 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇定時器模式:TIM脈沖寬度調(diào)制模式1
  74.          TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
  75.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高
  76.         TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根據(jù)T指定的參數(shù)初始化外設(shè)TIM3 OC2
  77.         TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的預(yù)裝載寄存器
  78.         
  79.                 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇定時器模式:TIM脈沖寬度調(diào)制模式1
  80.          TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
  81.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高
  82.         TIM_OC3Init(TIM3, &TIM_OCInitStructure);  //根據(jù)T指定的參數(shù)初始化外設(shè)TIM3 OC3
  83.         TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR3上的預(yù)裝載寄存器
  84.         
  85.                 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇定時器模式:TIM脈沖寬度調(diào)制模式1
  86.          TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
  87.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高
  88.         TIM_OC4Init(TIM3, &TIM_OCInitStructure);  //根據(jù)T指定的參數(shù)初始化外設(shè)TIM3 OC4
  89.         TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR4上的預(yù)裝載寄存器
  90.         
  91.         TIM_Cmd(TIM3, ENABLE);  //使能TIM3
  92. }



  93. void L9110_Init(void)
  94. {

  95. GPIO_InitTypeDef  GPIO_InitStructure;
  96.          
  97. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);         //使能PC端口時鐘
  98.         
  99. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5;                                 //LED0-->PB.5 端口配置
  100. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽輸出
  101. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度為50MHz
  102. GPIO_Init(GPIOC, &GPIO_InitStructure);                                         //根據(jù)設(shè)定參數(shù)初始化GPIOB.5
  103. GPIO_ResetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5);                                                 //PB.5 輸出高

  104. // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                             //LED1-->PE.5 端口配置, 推挽輸出
  105. // GPIO_Init(GPIOE, &GPIO_InitStructure);                                           //推挽輸出 ,IO口速度為50MHz
  106. // GPIO_SetBits(GPIOE,GPIO_Pin_5);                                                  //PE.5 輸出高
  107. }

  108. void L9100PWM1(vs16 speed1)
  109. {
  110.         if(speed1>=0)
  111.         {
  112.                 MA=0;
  113.                 TIM_SetCompare1(TIM3,speed1);
  114.         }
  115.         else
  116.         {
  117.                 MA=1;
  118.                 speed1=900+speed1;
  119.                 TIM_SetCompare1(TIM3,speed1);
  120.                
  121.         }
  122. }

  123. void L9100PWM2(vs16 speed2)
  124. {
  125.         if(speed2>=0)
  126.         {
  127.                 MB=0;
  128.                 TIM_SetCompare2(TIM3,speed2);
  129.         }
  130.         else
  131.         {
  132.                 MB=1;
  133.                 speed2=900+speed2;
  134.                 TIM_SetCompare2(TIM3,speed2);
  135.                
  136.         }
  137. }

  138. void L9100PWM3(vs16 speed3)
  139. {
  140.         if(speed3>=0)
  141.         {
  142.                 MC=0;
  143.                 TIM_SetCompare3(TIM3,speed3);
  144.         }
  145.         else
  146.         {
  147.                 MC=1;
  148.                 speed3=900+speed3;
  149.                 TIM_SetCompare3(TIM3,speed3);
  150.                
  151.         }
  152. }

  153. void L9100PWM4(vs16 speed4)
  154. {
  155.         if(speed4>=0)
  156.         {
  157.                 MD=0;
  158.                 TIM_SetCompare4(TIM3,speed4);
  159.         }
  160.         else
  161.         {
  162.                 MD=1;
  163.                 speed4=900+speed4;
  164.                 TIM_SetCompare4(TIM3,speed4);
  165.                
  166.         }
  167. }
復(fù)制代碼

所有資料51hei提供下載:
l9110s.7z (187.15 KB, 下載次數(shù): 153)




作者: witp    時間: 2019-8-12 15:48
好東西呀,謝謝分享,正需要這東西參考
作者: 豬不怕壯    時間: 2021-5-7 23:23
本帖最后由 豬不怕壯 于 2021-5-9 00:09 編輯

請教一下怎么停止轉(zhuǎn)動呢?
作者: houxixixix    時間: 2023-4-26 19:21
豬不怕壯 發(fā)表于 2021-5-7 23:23
請教一下怎么停止轉(zhuǎn)動呢?

直流電機應(yīng)該是調(diào)節(jié)占空比控制轉(zhuǎn)速,貌似stm32里TIM_SetCompare這個比較函數(shù)里可以設(shè)置占空比,還在研究
作者: li64331218    時間: 2023-4-27 13:17
對的! 點贊分享。學(xué)習(xí)參考下





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1