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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4328|回復: 3
打印 上一主題 下一主題
收起左側

STM32 BLDC驅動源程序分享

  [復制鏈接]
跳轉到指定樓層
樓主
ID:899289 發表于 2021-4-1 18:17 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
此程序只有轉速PID 速度通過程序Set_Point調節 調節范圍在100到12000之間
KEY2控制無刷電機啟動
KEY3控制無刷電機停止

單片機源程序如下:
  1. #include "includes.h"

  2. void Delay_us(uint8_t t);
  3. /**********常量定義**********/
  4. #define IDLE    0
  5. #define        START        1
  6. #define        RUN            2
  7. #define        STOP    3
  8. #define FAULT   4
  9. #define HIGH        1480
  10. #define LOW     3
  11. /*********全局變量***********/
  12. u8 state;                                   //主狀態
  13. FlagStatus zheng_fan = RESET;//初始化后為正轉
  14. uint8_t stalling_count = 0;                   //堵轉計數器

  15. /**********************************************************************
  16. * Description    : None
  17. * Input          : None
  18. * Output         : None
  19. * Return         : None
  20. * Attention      : None
  21. **********************************************************************/
  22. void BLDC_GPIOConfig(void)
  23. {
  24.     GPIO_InitTypeDef GPIO_InitStructure;
  25.          
  26.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;  //TIM1輸出
  27.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                                                  
  28.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  29.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  30.                          
  31.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;//TIM1輸出
  32.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                                                  
  33.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  34.     GPIO_Init(GPIOB, &GPIO_InitStructure);

  35.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;              //TIM3的霍爾輸入
  36.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  37.     GPIO_Init(GPIOA, &GPIO_InitStructure);

  38.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                         //TIM3的霍爾輸入
  39.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  40.     GPIO_Init(GPIOB, &GPIO_InitStructure);   
  41. }
  42. /**********************************************************************
  43. * Description    : None
  44. * Input          : None
  45. * Output         : None
  46. * Return         : None
  47. * Attention      : None
  48. **********************************************************************/
  49. void BLDC_TIM1Config(void)
  50. {
  51.    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;                           //基本結構體變量定義
  52.    TIM_OCInitTypeDef  TIM_OCInitStructure;                     //輸出結構體變量定義
  53.    TIM_BDTRInitTypeDef  TIM_BDTRInitStructure;                                   //死區剎車結構體變量定義

  54.    TIM_DeInit(TIM1);

  55.    TIM_TimeBaseStructure.TIM_Prescaler = 2;                                           //TIM基本初始化
  56.    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned2;//中央對齊計數模式
  57.    TIM_TimeBaseStructure.TIM_Period = 1499;                                           //PWM 16K
  58.    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  59.    TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

  60.    TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);

  61.    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;                    //TIM輸出通道初始化
  62.    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
  63.    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;                  
  64.    TIM_OCInitStructure.TIM_Pulse =1200;
  65.    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  66.    TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;         
  67.    TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  68.    TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;         
  69.   
  70.    TIM_OC1Init(TIM1,&TIM_OCInitStructure);

  71.    TIM_OCInitStructure.TIM_Pulse =1200;
  72.    TIM_OC2Init(TIM1,&TIM_OCInitStructure);

  73.    TIM_OCInitStructure.TIM_Pulse =1200;
  74.    TIM_OC3Init(TIM1,&TIM_OCInitStructure);

  75.    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;                    //TIM輸出通道4初始化,用來觸發AD注入采樣
  76.    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;                  
  77.    TIM_OCInitStructure.TIM_Pulse =1495;
  78.    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;           
  79.   
  80.    TIM_OC4Init(TIM1,&TIM_OCInitStructure);

  81.    TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;        //死區剎車初始化
  82.    TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
  83.    TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
  84.    TIM_BDTRInitStructure.TIM_DeadTime = 100;
  85.    TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;         //如打開,開機無輸出且狀態紊亂????
  86.    TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;
  87.    TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable;

  88.    TIM_BDTRConfig(TIM1,&TIM_BDTRInitStructure);

  89.    TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);  //使能捕獲比較寄存器預裝載(通道1)

  90.    TIM_OC2PreloadConfig(TIM1,TIM_OCPreload_Enable);         //使能捕獲比較寄存器預裝載(通道2)

  91.    TIM_OC3PreloadConfig(TIM1,TIM_OCPreload_Enable);         //使能捕獲比較寄存器預裝載(通道3)
  92.    
  93.    TIM_SelectInputTrigger(TIM1, TIM_TS_ITR2);        //輸入觸發源選擇TIM3   
  94.   
  95.    //TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Trigger);//從模式選擇 觸發          

  96.    TIM_CtrlPWMOutputs(TIM1,ENABLE);

  97.    TIM_Cmd(TIM1,ENABLE);
  98. }
  99. /**********************************************************************
  100. * Description    : None
  101. * Input          : None
  102. * Output         : None
  103. * Return         : None
  104. * Attention      : None
  105. **********************************************************************/
  106. void BLDC_TIM3Config(void)
  107. {
  108.    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;                           //基本結構體變量定義
  109.    TIM_ICInitTypeDef TIM_ICInitStructure;                      //定義結構體變量
  110.    TIM_OCInitTypeDef  TIM_OCInitStructure;                     //輸出結構體變量定義
  111.       
  112.    TIM_DeInit(TIM3);

  113.    TIM_TimeBaseStructure.TIM_Prescaler = 71;                                   //TIM基本初始化
  114.    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  115.    TIM_TimeBaseStructure.TIM_Period =65535;
  116.    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  117.    TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

  118.    TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);     
  119.       
  120.    TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;            //選擇通道1
  121.    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //輸入上升沿捕獲  
  122.    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_TRC;  //配置通道為輸入,并映射到哪里
  123.    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;       //輸入捕獲預分頻值
  124.    TIM_ICInitStructure.TIM_ICFilter = 10;                      //輸入濾波器帶寬設置

  125.    TIM_ICInit(TIM3, &TIM_ICInitStructure);                     //輸入通道配置

  126.    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;                     //TIM輸出通道初始化
  127.    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;            
  128.    TIM_OCInitStructure.TIM_Pulse =1023;
  129.    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;      
  130.   
  131.    TIM_OC2Init(TIM3,&TIM_OCInitStructure);

  132.    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;                     //TIM輸出通道初始化
  133.    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;            
  134.    TIM_OCInitStructure.TIM_Pulse =65535;
  135.    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;      
  136.   
  137.    TIM_OC4Init(TIM3,&TIM_OCInitStructure);

  138.    TIM_SelectHallSensor(TIM3,ENABLE);                          //使能TIMx的霍爾傳感器接口
  139.    
  140.    TIM_SelectInputTrigger(TIM3, TIM_TS_TI1F_ED);               //輸入觸發源選擇   
  141.   
  142.    TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);             //從模式選擇

  143.    TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);//主從模式選擇        
  144.    
  145.    TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_OC2Ref);      //選擇輸出觸發模式(TRGO端)

  146.    TIM_ITConfig(TIM3, TIM_IT_Trigger|TIM_IT_CC4, ENABLE);      //開定時器中斷
  147.    //TIM_Cmd(TIM3,ENABLE);
  148. }
  149. /**********************************************************************
  150. * Description    : None
  151. * Input          : None
  152. * Output         : None
  153. * Return         : None
  154. * Attention      : None
  155. **********************************************************************/
  156. void huanxiang(void)
  157. {
  158.   u8 irq_zhuanzi;

  159.   irq_zhuanzi=(u8)((GPIOA->IDR&0x000000c0)>>6);        //讀轉子位置
  160.   irq_zhuanzi|=(u8)((GPIOB->IDR&0x00000001)<<2);
  161.   if(zheng_fan==RESET)
  162.   {                                                                         //正轉
  163.     switch(irq_zhuanzi)                                 //根據轉子位置,決定CCER輸出相位和轉子字偏移量
  164.     {
  165. /*          case 0x01:{                                                                                                                             
  166.                                     TIM1->CCER=0x3081;    //1,4
  167.                             };break;
  168.           case 0x03:{
  169.                                   TIM1->CCER=0x3180;        //4,5                            
  170.                     };break;                                                       
  171.             case 0x02:{
  172.                                   TIM1->CCER=0x3108;        //2,5
  173.                             };break;
  174.           case 0x06:{
  175.                                   TIM1->CCER=0x3018;        //2,3                                 
  176.                     };break;
  177.           case 0x04:{
  178.                                   TIM1->CCER=0x3810;        //3,6                                 
  179.                     };break;
  180.           case 0x05:{
  181.                                             
  182.                                   TIM1->CCER=0x3801;    //1,6                                 
  183.                     };break;
  184.           default:break;  */
  185.           case 0x05:{                                                                                                                             
  186.                                     TIM1->CCER=0x3081;    //1,4
  187.                             };break;
  188.           case 0x04:{
  189.                                   TIM1->CCER=0x3180;        //4,5                            
  190.                     };break;                                                       
  191.             case 0x06:{
  192.                                   TIM1->CCER=0x3108;        //2,5
  193.                             };break;
  194.           case 0x02:{
  195.                                   TIM1->CCER=0x3018;        //2,3                                 
  196.                     };break;
  197.           case 0x03:{
  198.                                   TIM1->CCER=0x3810;        //3,6                                 
  199.                     };break;
  200.           case 0x01:{
  201.                                             
  202.                                   TIM1->CCER=0x3801;    //1,6                                 
  203.                     };break;
  204.           default:break;
  205.     }  
  206.   }
  207.   else
  208.   {                                                                         //反轉
  209.         switch(irq_zhuanzi)                                 //根據轉子位置,決定CCER輸出相位和轉子字偏移量
  210.     {
  211.           case 0x01:{                                                                               
  212.                                     TIM1->CCER=0x3810;
  213.                             };break;
  214.           case 0x05:{
  215.                                   TIM1->CCER=0x3018;                                    
  216.                     };break;                                                       
  217.             case 0x04:{
  218.                                   TIM1->CCER=0x3108;
  219.                             };break;
  220.           case 0x06:{
  221.                                   TIM1->CCER=0x3180;                                         
  222.                     };break;
  223.           case 0x02:{
  224.                                   TIM1->CCER=0x3081;                                         
  225.                     };break;
  226.           case 0x03:{                                              
  227.                                   TIM1->CCER=0x3801;                                         
  228.                     };break;
  229.           default:break;
  230.     }
  231.   }
  232. }
  233. /**************啟動******************/
  234. void BLDC_Start(void)
  235. {
  236.    TIM1->SMCR|=0x0006;        //開TIM1的輸入觸發       
  237.    TIM1->DIER=0x0040;         //開TIM1的觸發中斷
  238.    huanxiang();                              //調用換向函數,啟動                                                                   
  239.    TIM3->CR1|=0x0001;                  //開TIM3
  240.    TIM3->DIER|=0x0050;                  //開TIM3中斷  
  241. }
  242. void BLDC_Stop(void)
  243. {
  244.    TIM1->SMCR&=0xfff8;                  //關閉TIM1的輸入觸發
  245.    TIM1->CCER=0;              //關閉TIM1的六路輸出
  246.    Delay_us(40);                              //延時(加死區)
  247.    TIM1->CCER=0x0ccc;         //打開三路下管,進行能耗制動
  248.    while(stalling_count<1);    //等待電機停止(TIM3連續溢出10次,即認為電機已停轉)   
  249.    TIM1->CCER=0;              //關閉TIM1的六路輸出,關剎車                  
  250.    TIM3->CR1&=0xfffe;         //關閉TIM3                                                  
  251.    TIM3->CNT=0;               //清TIM3的計數器                                  
  252.    TIM3->DIER&=0xffaf;                  //關TIM3中斷
  253. }
  254. void Delay_us(uint8_t t)
  255. {
  256.    while(t--)
  257.    {
  258.    }
  259. }
  260. /**************停止******************/
  261. /*void stop(void)
  262. {
  263.    TIM1->SMCR&=0xfff8;                  //關閉TIM1的輸入觸發
  264.    TIM1->CCER=0;              //關閉TIM1的六路輸出
  265.    Delay(20);                              //延時(加死區)
  266.    TIM1->CCER=0x0ccc;         //打開三路下管,進行能耗制動
  267.    while(duzhuan_value<1);    //等待電機停止(TIM3連續溢出10次,即認為電機已停轉)   
  268.    TIM1->CCER=0;              //關閉TIM1的六路輸出,關剎車                  
  269.    TIM3->CR1&=0xfffe;         //關閉TIM3                                                  
  270.    TIM3->CNT=0;               //清TIM3的計數器                                  
  271.    TIM3->DIER&=0xffaf;                  //關TIM3中斷
  272.    data_reset();                   //復位運行參數
  273. }*/
復制代碼

所有代碼51hei提供下載:
STM32速度環PID.rar (390.88 KB, 下載次數: 107)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏9 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:319585 發表于 2021-7-16 20:34 | 只看該作者
這個不錯的,需要下載來看看。基本完整的代碼
回復

使用道具 舉報

板凳
ID:924874 發表于 2023-3-23 15:17 | 只看該作者
請問有試過的嗎
回復

使用道具 舉報

地板
ID:270740 發表于 2024-1-2 15:30 | 只看該作者
試過了,不能使用,他是從網上抄過來的
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩二区 | 97精品超碰一区二区三区 | 中文字幕高清免费日韩视频在线 | 久草视频在线看 | 一级黄色毛片免费 | 国产片侵犯亲女视频播放 | 影视先锋av资源噜噜 | 成人高清视频在线观看 | 少妇精品亚洲一区二区成人 | 性xxxxx| 尤物视频在线免费观看 | 中文字幕中文字幕 | 日韩成人精品在线观看 | 欧美久久视频 | 久久国产一区 | 人人艹人人 | 日韩视频在线一区 | aaaa一级毛片 | 亚洲 中文 欧美 日韩 在线观看 | 羞羞的视频网站 | 久久久一区二区三区四区 | 日韩一区二区三区在线观看视频 | aaa大片免费观看 | 一区二区三区在线 | 欧 | 欧美日韩国产一区二区三区 | 国产日韩免费视频 | 999精品视频 | 日本爱爱视频 | 特黄特黄a级毛片免费专区 av网站免费在线观看 | 91精品一区二区三区久久久久 | 亚洲在线中文字幕 | 日韩免费视频 | 中文字幕免费视频 | 国产日产精品一区二区三区四区 | www.欧美.com | 久久国产精品免费一区二区三区 | 爱爱小视频| 九九亚洲| 免费成年网站 | 91热在线 | 91精品国产综合久久久久久漫画 |