找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3329|回复: 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, 下载次数: 100)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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 单片机教程网

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