初级会员

- 积分
- 132
- 金钱
- 132
- 注册时间
- 2015-6-18
- 在线时间
- 129 小时
|
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; //êäèë2¶»ñÂË2¨Æ÷
TIM2->CCMR2 |= IC_FILTER;
TIM2->CCMR3 |= IC_FILTER;
//prescale = div3 @ 16MHz -> 0.5us/count * 24MHz -> 0.33us/count
TIM2-> SCR = 0;
TIM2->ARRH=0xff;//¼ÆêyÖüÆúéèÎa×î′ó
TIM2->ARRL=0xff;
TIM2->CCER1 |= 0x01;//TIM2μÄCH1\CH2\CH3í¨μàê1Äü2¶»ñ1|Äü
TIM2->CCER1 |= 0x10;
TIM2->CCER2 |= 0x01;
TIM2->CR1 |= 0x01;//ê1ÄüTIM2¶¨ê±Æ÷
}
//¸ù¾YHALL×′쬻»Ï࣬Æô¶ˉμç»úÔËDD
void TIM2_InitCapturePolarity(void)
{
u8 bHStatus = 0;
GPIOD->DDR &= (u8)(~(0x1c));//HALL¶Ë¿úÄ£ê½ÅäÖÃ
// 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];//μÃμ½»»Ïà2½Dò
if (bHallStartStep == 7)//2»¸Ã3öÏÖμÄHALL×′ì¬
{
return;
}
TIM2->SR1=(u8)~(TIM2_IT_CC3|TIM2_IT_CC2|TIM2_IT_CC1);
TIM2->IER = 0x0e;//ê1Äüêäèë2¶»ñÖD¶Ï
ComHandler();//êä3ö WMDÅoÅ£¬Æô¶ˉμç»ú
}
|
最佳答案
查看完整内容[请看2#楼]
{7,5,3,4,1,0,2,7},//Õy×a
{7,2,0,1,4,3,5,7}//·′×a
乱码看着太费劲了
首先要了解上面的数组,数组使用不同的数表示三个霍尔的状态,
转化成二进制就是了
|