OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4025|回复: 2

【求助】求大神讲解一下120°霍尔传感器检测位置的思路

[复制链接]

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
发表于 2016-3-7 12:15:47 | 显示全部楼层 |阅读模式
30金钱
书上看了一段用STM8S来控制无刷电机的应用代码,但是不是很理解这段检测霍尔状态并换相的代码,求大神讲解一下!!
#include "stm8s.h"  ///////////////////////////hell.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 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

//ÏÂÇűۿa1Ø¿ØÖƶ˿ú¶¨òå
#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);       


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include "hall.h"//////////////////hall.c文件

unsigned char bHallStartStep;//»»Ïà2½Dò±äá¿¶¨òå
//»»Ïà2½DòÖμ0-5·Ö±e¶Ôó|AB\AC\BC\BA\CA\CB
unsigned int OutPwmValue=0;//PWMêä3öÖμ±äá¿¶¨òå


unsigned char bHallSteps[2][8]={
{7,5,3,4,1,0,2,7},//Õy×a
{7,2,0,1,4,3,5,7}//·′×a
};

const unsigned char PWM_EN1_TAB[6]={0x01,0x01,0x10,0x10,0x00,0x00};
//áù2½·¨ÖD£¬CH1\CH2í¨μ༫DÔ¼°ê1ÄüÅäÖÃ
const unsigned char PWM_EN2_TAB[6]={0x0,0x00,0x00,0x0,0x1,0x1};
//áù2½·¨ÖD£¬CH3í¨μ༫DÔ¼°ê1ÄüÅäÖÃ

//3õê¼»ˉHALL2¶»ñêäè붨òåÆ÷
void Init_TIM2(void)
{
        //¼ÆêyÆ÷½ûÖ1¡¢ARRÔ¤×°ÔØ½ûÖ1¡¢ÏòéϼÆêy¡¢±ßÑØ¶ÔÆëÄ£ê½
        TIM2->CR1 = BIT2;

        //½ûÖ1TIM2ËùóDÖD¶Ï
        TIM2->IER = 0;//½ûÖ1ÖD¶Ï

        TIM2->CCMR1 = 0x01;//TIM2μÄCH1\CH2\CH3í¨μàÅäÖÃÎaêäèë
        TIM2->CCMR2 = 0x01;
        TIM2->CCMR3 = 0x01;

        #define IC_FILTER (u8)(5 << 4)
        TIM2->CCMR1 |= IC_FILTER; //ê&#228;è&#235;2&#182;&#187;&#241;&#194;&#203;2¨&#198;÷
        TIM2->CCMR2 |= IC_FILTER;
        TIM2->CCMR3 |= IC_FILTER;

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

        TIM2->ARRH=0xff;//&#188;&#198;êy&#214;ü&#198;úéè&#206;a×&#238;′ó
        TIM2->ARRL=0xff;
       
        TIM2->CCER1 |= 0x01;//TIM2μ&#196;CH1\CH2\CH3í¨μàê1&#196;ü2&#182;&#187;&#241;1|&#196;ü
        TIM2->CCER1 |= 0x10;
        TIM2->CCER2 |= 0x01;

        TIM2->CR1 |= 0x01;//ê1&#196;üTIM2&#182;¨ê±&#198;÷
}

//&#184;ù&#190;YHALL×′ì&#172;&#187;&#187;&#207;à£&#172;&#198;&#244;&#182;ˉμ&#231;&#187;ú&#212;&#203;DD
void TIM2_InitCapturePolarity(void)
        {
                u8 bHStatus = 0;
                GPIOD->DDR &= (u8)(~(0x1c));//HALL&#182;&#203;&#191;ú&#196;£ê&#189;&#197;&#228;&#214;&#195;
               
                // 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[0][bHStatus];//μ&#195;μ&#189;&#187;&#187;&#207;à2&#189;Dò

                if (bHallStartStep == 7)//2&#187;&#184;&#195;3&#246;&#207;&#214;μ&#196;HALL×′ì&#172;
                {                       
                        return;
                }
               
                TIM2->SR1=(u8)~(TIM2_IT_CC3|TIM2_IT_CC2|TIM2_IT_CC1);       
                TIM2->IER = 0x0e;//ê1&#196;üê&#228;è&#235;2&#182;&#187;&#241;&#214;D&#182;&#207;
                ComHandler();//ê&#228;3&#246WMD&#197;o&#197;£&#172;&#198;&#244;&#182;ˉμ&#231;&#187;ú
}


最佳答案

查看完整内容[请看2#楼]

{7,5,3,4,1,0,2,7},//Õy×a {7,2,0,1,4,3,5,7}//·′×a 乱码看着太费劲了 首先要了解上面的数组,数组使用不同的数表示三个霍尔的状态, 转化成二进制就是了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

22

主题

751

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1606
金钱
1606
注册时间
2015-6-10
在线时间
223 小时
发表于 2016-3-7 12:15:48 | 显示全部楼层
{7,5,3,4,1,0,2,7},//&#213;y×a
{7,2,0,1,4,3,5,7}//·′×a

乱码看着太费劲了

首先要了解上面的数组,数组使用不同的数表示三个霍尔的状态,

转化成二进制就是了
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-3-7 13:37:48 | 显示全部楼层
求助。。。。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 13:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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