4658|6

37

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

有哪位大神可以详解下这个程序的意思吗?这是一个BLDC电机霍尔控制程序 [复制链接]

#include "stm8s.h"  

#define H1_PORT GPIOD->IDR
#define H1_PIN  BIT4

#define H2_PORT GPIOD->IDR
#define H2_PIN  BIT3

#define H3_PORT GPIOD->IDR
#define H3_PIN  BIT2

extern unsigned char FaultF;//故障标志
extern unsigned char Run_dir;
extern unsigned int OutPwmValue;
extern unsigned char bHallStartStep;

#define BIT0 0x01
#define BIT1 0x02
#define BIT2 0x04
#define BIT3 0x08
#define BIT4 0x10
#define BIT5 0x20
#define BIT6 0x40
#define BIT7 0x80

//负端
#define MCO0_PORT GPIOB
#define MCO0_PIN        GPIO_PIN_0
#define MCO2_PORT GPIOB
#define MCO2_PIN        GPIO_PIN_1
#define MCO4_PORT GPIOB
#define MCO4_PIN        GPIO_PIN_2

#define PWM_A_ON MCO0_PORT->ODR |= (u8)MCO0_PIN;
#define PWM_B_ON MCO2_PORT->ODR |= (u8)MCO2_PIN;
#define PWM_C_ON MCO4_PORT->ODR |= (u8)MCO4_PIN;

#define PWM_A_OFF MCO0_PORT->ODR &= (u8)(~MCO0_PIN);
#define PWM_B_OFF MCO2_PORT->ODR &= (u8)(~MCO2_PIN);
#define PWM_C_OFF MCO2_PORT->ODR &= (u8)(~MCO4_PIN);

void Init_TIM2(void);
void TIM2_InitCapturePolarity(void);
void ComHandler(void);       


此帖出自stm32/stm8论坛

最新回复

这个很简单的,你那个表可以随便定义,但是要按照顺序来,定义好以后霍尔还有6种组合,然后每种组合跑一遍,电流最小那个记下来就是最有的霍尔组合了。   详情 回复 发表于 2020-5-20 11:04
点赞 关注
 

回复
举报

1142

帖子

24

TA的资源

纯净的硅(高级)

沙发
 
你这只是程序的声明部分啊,没什么难度啊,都是些IO宏定义,真正的程序你确没有列出来,
我最近也在做霍尔有感电机开发,手持的一个设备,用的进口的无刷电机
此帖出自stm32/stm8论坛

点评

KCP
#include "hall.h" unsigned char FaultF=0;//故障标志 unsigned char Run_dir=1;//运转方向,0-1对立 unsigned char bHallStartStep; unsigned int OutPwmValue=0; unsigned char bHallSteps[2][8]={ {  详情 回复 发表于 2017-9-5 09:22
 
 

回复

37

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
fxyc87 发表于 2017-9-4 21:54
你这只是程序的声明部分啊,没什么难度啊,都是些IO宏定义,真正的程序你确没有列出来,
我最近也在做霍尔 ...

#include "hall.h"

unsigned char FaultF=0;//故障标志
unsigned char Run_dir=1;//运转方向,0-1对立
unsigned char bHallStartStep;

unsigned int OutPwmValue=0;

unsigned char bHallSteps[2][8]={
{7,5,3,4,1,0,2,7},
{7,2,0,1,4,3,5,7}
};

const unsigned char PWM_EN1_TAB[6]={0x01,0x01,0x10,0x10,0x00,0x00};
const unsigned char PWM_EN2_TAB[6]={0x0,0x00,0x00,0x0,0x1,0x1};

void Init_TIM2(void)
{
        //counter disabled, ARR preload register disabled, up counting, edge aligned mode
        TIM2->CR1 = BIT2;

        //disable all interrupts
        TIM2->IER = 0;//禁止中断

        TIM2->CCMR1 = 0x01;//通道配置为输入
        TIM2->CCMR2 = 0x01;
        TIM2->CCMR3 = 0x01;

        #define IC_FILTER (u8)(5 << 4)//0101 0000
        TIM2->CCMR1 |= IC_FILTER; //输入捕获滤波器
        TIM2->CCMR2 |= IC_FILTER;
        TIM2->CCMR3 |= IC_FILTER;

        //prescale = div3 @ 16MHz -> 0.5us/count * 24MHz -> 0.33us/count
        //   8/16MHz=0.5us, 8/24MHz=0.33us
        TIM2->PSCR = 0;

        TIM2->ARRH=0xff;//计数周期设为最大
        TIM2->ARRL=0xff;
       
        TIM2->CCER1 |= 0x01;//CH1,CH2,CH3通道使能捕获功能
        TIM2->CCER1 |= 0x10;
        TIM2->CCER2 |= 0x01;

        TIM2->CR1 |= 0x01;//使能定时器
}

void TIM2_InitCapturePolarity(void)
        {
                u8 bHStatus = 0;
                GPIOD->DDR &= (u8)(~(0x1c));
        //        GPIOD->CR1|=(u8)(0x1c);
               
                // Read status of H1 and set the expected polarity
        if (H1_PORT & H1_PIN)
        {
                TIM2->CCER1 |= BIT1;
                bHStatus |= BIT2;
        }
        else
        {
                TIM2->CCER1 &= (u8)(~(BIT1));
        }
       
        // Read status of H2 and set the expected polarity
        if (H2_PORT & H2_PIN)
        {
                TIM2->CCER1 |= BIT5;
                bHStatus |= BIT1;
        }
        else
        {
                TIM2->CCER1 &= (u8)(~(BIT5));
        }
               
                // Read status of H3 and set the expected polarity
        if (H3_PORT & H3_PIN)
        {
                        TIM2->CCER2 |= BIT1;
                        bHStatus |= BIT0;
        }
        else
        {
                        TIM2->CCER2 &= (u8)(~(BIT1));
        }

                bHallStartStep = bHallSteps[Run_dir][bHStatus];

                if (bHallStartStep == 7)//不该出现的HALL状态
                {
                        FaultF=1;
                        return;
                }
               
                TIM2->SR1=(u8)~(TIM2_IT_CC3|TIM2_IT_CC2|TIM2_IT_CC1);       
                TIM2->IER = 0x0e;//使能输入捕获中断
                ComHandler();
}

@near @interrupt @svlreg void TIM2_CAP_COM_IRQHandler(void)
{
        u8 bHStatus = 0;

        // Read status of H1 and set the expected polarity
        if (H1_PORT & H1_PIN)
        {
                TIM2->CCER1 |= BIT1;
                bHStatus |= BIT2;
        }
        else
        {
                TIM2->CCER1 &= (u8)(~(BIT1));
        }
       
        // Read status of H2 and set the expected polarity
        if (H2_PORT & H2_PIN)
        {
                TIM2->CCER1 |= BIT5;
                bHStatus |= BIT1;
        }
        else
        {
                TIM2->CCER1 &= (u8)(~(BIT5));
        }
       
        // Read status of H3 and set the expected polarity
        if (H3_PORT & H3_PIN)
        {
                TIM2->CCER2 |= BIT1;
                bHStatus |= BIT0;
        }
        else
        {
                TIM2->CCER2 &= (u8)(~(BIT1));
        }
       
        if (TIM2->SR1 & BIT2)
        {
                TIM2->SR1=(u8)(~TIM2_IT_CC2);
        }

        if (TIM2->SR1 & BIT1)
        {
                TIM2->SR1=(u8)(~TIM2_IT_CC1);
        }

        if (TIM2->SR1 & BIT3)
        {
                TIM2->SR1=(u8)(~TIM2_IT_CC3);
        }


        bHallStartStep = bHallSteps[Run_dir][bHStatus];

        if (bHallStartStep == 7)
        {
                FaultF=1;
        }
       
        ComHandler();       
        return;
}

void         ComHandler(void)
{
        TIM1->BKR &= (uint8_t)(~TIM1_BKR_MOE);//禁止PWM输出
        PWM_A_OFF;
        PWM_B_OFF;
        PWM_C_OFF;
        if(FaultF!=0)return;         
         
        if(bHallStartStep==0)//AB
        {
                TIM1->CCR1H = (uint8_t)(OutPwmValue >> 8);
    TIM1->CCR1L = (uint8_t)(OutPwmValue);
                PWM_B_ON;
        }
  else if(bHallStartStep==1)        //AC
        {
                TIM1->CCR1H = (uint8_t)(OutPwmValue >> 8);
    TIM1->CCR1L = (uint8_t)(OutPwmValue);
          PWM_C_ON;
        }
        else if(bHallStartStep==2)        //BC
        {
                TIM1->CCR2H = (uint8_t)(OutPwmValue >> 8);
    TIM1->CCR2L = (uint8_t)(OutPwmValue);
          PWM_C_ON;
        }
        else if(bHallStartStep==3)        //BA
        {
                TIM1->CCR2H = (uint8_t)(OutPwmValue >> 8);
    TIM1->CCR2L = (uint8_t)(OutPwmValue);
          PWM_A_ON;
        }
        else if(bHallStartStep==4)//CA
        {
                TIM1->CCR3H = (uint8_t)(OutPwmValue >> 8);
    TIM1->CCR3L = (uint8_t)(OutPwmValue);
          PWM_A_ON;
        }
        else if(bHallStartStep==5)        //CB
        {
                TIM1->CCR3H = (uint8_t)(OutPwmValue >> 8);
    TIM1->CCR3L = (uint8_t)(OutPwmValue);
          PWM_B_ON;
        }
       
        TIM1->CCER1=PWM_EN1_TAB[bHallStartStep];
        TIM1->CCER2=PWM_EN2_TAB[bHallStartStep];               
        TIM1->BKR|=TIM1_BKR_MOE;//使能PWM输出
}


这个程序的6,7,8行看不懂他这个霍尔步序的定义啊和PWM的使能配置
此帖出自stm32/stm8论坛
 
 

回复

37

帖子

0

TA的资源

一粒金砂(中级)

4
 
fxyc87 发表于 2017-9-4 21:54
你这只是程序的声明部分啊,没什么难度啊,都是些IO宏定义,真正的程序你确没有列出来,
我最近也在做霍尔 ...

#include "hall.h"

unsigned char FaultF=0;//故障标志
unsigned char Run_dir=1;//运转方向,0-1对立
unsigned char bHallStartStep;

unsigned int OutPwmValue=0;

unsigned char bHallSteps[2][8]={
{7,5,3,4,1,0,2,7},
{7,2,0,1,4,3,5,7}
};

const unsigned char PWM_EN1_TAB[6]={0x01,0x01,0x10,0x10,0x00,0x00};
const unsigned char PWM_EN2_TAB[6]={0x0,0x00,0x00,0x0,0x1,0x1};

void Init_TIM2(void)
{
        //counter disabled, ARR preload register disabled, up counting, edge aligned mode
        TIM2->CR1 = BIT2;

        //disable all interrupts
        TIM2->IER = 0;//禁止中断

        TIM2->CCMR1 = 0x01;//通道配置为输入
        TIM2->CCMR2 = 0x01;
        TIM2->CCMR3 = 0x01;

        #define IC_FILTER (u8)(5 << 4)//0101 0000
        TIM2->CCMR1 |= IC_FILTER; //输入捕获滤波器
        TIM2->CCMR2 |= IC_FILTER;
        TIM2->CCMR3 |= IC_FILTER;

        //prescale = div3 @ 16MHz -> 0.5us/count * 24MHz -> 0.33us/count
        //   8/16MHz=0.5us, 8/24MHz=0.33us
        TIM2->PSCR = 0;

        TIM2->ARRH=0xff;//计数周期设为最大
        TIM2->ARRL=0xff;
       
        TIM2->CCER1 |= 0x01;//CH1,CH2,CH3通道使能捕获功能
        TIM2->CCER1 |= 0x10;
        TIM2->CCER2 |= 0x01;

        TIM2->CR1 |= 0x01;//使能定时器
}

void TIM2_InitCapturePolarity(void)
        {
                u8 bHStatus = 0;
                GPIOD->DDR &= (u8)(~(0x1c));
        //        GPIOD->CR1|=(u8)(0x1c);
               
                // Read status of H1 and set the expected polarity
        if (H1_PORT & H1_PIN)
        {
                TIM2->CCER1 |= BIT1;
                bHStatus |= BIT2;
        }
        else
        {
                TIM2->CCER1 &= (u8)(~(BIT1));
        }
       
        // Read status of H2 and set the expected polarity
        if (H2_PORT & H2_PIN)
        {
                TIM2->CCER1 |= BIT5;
                bHStatus |= BIT1;
        }
        else
        {
                TIM2->CCER1 &= (u8)(~(BIT5));
        }
               
                // Read status of H3 and set the expected polarity
        if (H3_PORT & H3_PIN)
        {
                        TIM2->CCER2 |= BIT1;
                        bHStatus |= BIT0;
        }
        else
        {
                        TIM2->CCER2 &= (u8)(~(BIT1));
        }

                bHallStartStep = bHallSteps[Run_dir][bHStatus];

                if (bHallStartStep == 7)//不该出现的HALL状态
                {
                        FaultF=1;
                        return;
                }
               
                TIM2->SR1=(u8)~(TIM2_IT_CC3|TIM2_IT_CC2|TIM2_IT_CC1);       
                TIM2->IER = 0x0e;//使能输入捕获中断
                ComHandler();
}

@near @interrupt @svlreg void TIM2_CAP_COM_IRQHandler(void)
{
        u8 bHStatus = 0;

        // Read status of H1 and set the expected polarity
        if (H1_PORT & H1_PIN)
        {
                TIM2->CCER1 |= BIT1;
                bHStatus |= BIT2;
        }
        else
        {
                TIM2->CCER1 &= (u8)(~(BIT1));
        }
       
        // Read status of H2 and set the expected polarity
        if (H2_PORT & H2_PIN)
        {
                TIM2->CCER1 |= BIT5;
                bHStatus |= BIT1;
        }
        else
        {
                TIM2->CCER1 &= (u8)(~(BIT5));
        }
       
        // Read status of H3 and set the expected polarity
        if (H3_PORT & H3_PIN)
        {
                TIM2->CCER2 |= BIT1;
                bHStatus |= BIT0;
        }
        else
        {
                TIM2->CCER2 &= (u8)(~(BIT1));
        }
       
        if (TIM2->SR1 & BIT2)
        {
                TIM2->SR1=(u8)(~TIM2_IT_CC2);
        }

        if (TIM2->SR1 & BIT1)
        {
                TIM2->SR1=(u8)(~TIM2_IT_CC1);
        }

        if (TIM2->SR1 & BIT3)
        {
                TIM2->SR1=(u8)(~TIM2_IT_CC3);
        }


        bHallStartStep = bHallSteps[Run_dir][bHStatus];

        if (bHallStartStep == 7)
        {
                FaultF=1;
        }
       
        ComHandler();       
        return;
}

void         ComHandler(void)
{
        TIM1->BKR &= (uint8_t)(~TIM1_BKR_MOE);//禁止PWM输出
        PWM_A_OFF;
        PWM_B_OFF;
        PWM_C_OFF;
        if(FaultF!=0)return;         
         
        if(bHallStartStep==0)//AB
        {
                TIM1->CCR1H = (uint8_t)(OutPwmValue >> 8);
    TIM1->CCR1L = (uint8_t)(OutPwmValue);
                PWM_B_ON;
        }
  else if(bHallStartStep==1)        //AC
        {
                TIM1->CCR1H = (uint8_t)(OutPwmValue >> 8);
    TIM1->CCR1L = (uint8_t)(OutPwmValue);
          PWM_C_ON;
        }
        else if(bHallStartStep==2)        //BC
        {
                TIM1->CCR2H = (uint8_t)(OutPwmValue >> 8);
    TIM1->CCR2L = (uint8_t)(OutPwmValue);
          PWM_C_ON;
        }
        else if(bHallStartStep==3)        //BA
        {
                TIM1->CCR2H = (uint8_t)(OutPwmValue >> 8);
    TIM1->CCR2L = (uint8_t)(OutPwmValue);
          PWM_A_ON;
        }
        else if(bHallStartStep==4)//CA
        {
                TIM1->CCR3H = (uint8_t)(OutPwmValue >> 8);
    TIM1->CCR3L = (uint8_t)(OutPwmValue);
          PWM_A_ON;
        }
        else if(bHallStartStep==5)        //CB
        {
                TIM1->CCR3H = (uint8_t)(OutPwmValue >> 8);
    TIM1->CCR3L = (uint8_t)(OutPwmValue);
          PWM_B_ON;
        }
       
        TIM1->CCER1=PWM_EN1_TAB[bHallStartStep];
        TIM1->CCER2=PWM_EN2_TAB[bHallStartStep];               
        TIM1->BKR|=TIM1_BKR_MOE;//使能PWM输出
}

这个程序的6,7,8行看不懂他这个霍尔步序的定义啊和PWM的使能配置
此帖出自stm32/stm8论坛
 
 
 

回复

1142

帖子

24

TA的资源

纯净的硅(高级)

5
 
你需要了解有感无刷电机的驱动方式,
此帖出自stm32/stm8论坛

点评

KCP
我是说这个步序定义是怎么来的 unsigned char bHallSteps[2][8]={ {7,5,3,4,1,0,2,7}, {7,2,0,1,4,3,5,7} }; const unsigned char PWM_EN1_TAB[6]={0x01,0x01,0x10,0x10,0x00,0x00}; const unsigned char PW  详情 回复 发表于 2017-9-6 20:22
 
 
 

回复

37

帖子

0

TA的资源

一粒金砂(中级)

6
 
fxyc87 发表于 2017-9-5 12:38
你需要了解有感无刷电机的驱动方式,

我是说这个步序定义是怎么来的
unsigned char bHallSteps[2][8]={
{7,5,3,4,1,0,2,7},
{7,2,0,1,4,3,5,7}
};

const unsigned char PWM_EN1_TAB[6]={0x01,0x01,0x10,0x10,0x00,0x00};
const unsigned char PWM_EN2_TAB[6]={0x0,0x00,0x00,0x0,0x1,0x1};
此帖出自stm32/stm8论坛
 
 
 

回复

30

帖子

0

TA的资源

一粒金砂(中级)

7
 

这个很简单的,你那个表可以随便定义,但是要按照顺序来,定义好以后霍尔还有6种组合,然后每种组合跑一遍,电流最小那个记下来就是最有的霍尔组合了。

此帖出自stm32/stm8论坛
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表