初级会员

- 积分
- 132
- 金钱
- 132
- 注册时间
- 2015-6-18
- 在线时间
- 129 小时
|

楼主 |
发表于 2016-7-8 14:18:43
|
显示全部楼层
#include "bldc.h"
#include "led.h"
#include "timer.h"
#include "beep.h"
u16 led0pwmval;//占空比30%
unsigned char bHallStartStep;//相序
unsigned char bHallSteps[2][8]={
{7,5,3,4,1,0,2,7},//正转
{7,2,0,1,4,3,5,7}//反转
};
unsigned int HALLcount=0;
void TIM2_Hallcap_Init(void)//三路霍尔输入捕获
{
RCC->APB1ENR|=1<<0;//使能TIM2
RCC->APB2ENR|=1<<2; //使能PA
GPIOA->CRL&=0XFFFFF000; //PA0、PA1、PA2清除之前设置
GPIOA->CRL|=0X00000888; //PA0、PA1、PA2 输入
GPIOA->ODR&=0XFFFFFFF8; // 下拉
TIM2->ARR=0XFFFF;
TIM2->PSC=0;
TIM2->DIER&=0x0000; //禁止所有中断
TIM2->CCMR1|=1<<0; //CC1S=01 选择输入端 IC1映射到TI1
TIM2->CCMR1|=1<<8; //CC2S=01 选择输入端 IC2映射到TI2
TIM2->CCMR2|=1<<0; //CC3S=01
TIM2->CCER|=1<<0;
TIM2->CCER|=1<<4;
TIM2->CCER|=1<<8;
// TIM2->DIER|=1<<0; //允许更新中断
TIM2->CR1|=0x01; //使能定时器2
MY_NVIC_Init(2,0,TIM2_IRQn,2);//抢占2,子优先级0,组2
}
void Gethallval(void)//根据霍尔状态换相
{
u8 bHStatus = 0;
if(PAin(0)==1)
{
TIM2->CCER|=1<<1;//改为下降沿捕获
bHStatus |= BIT2;
// LED0=0;
}
else
{
TIM2->CCER|=~(1<<1);//上升沿捕获
// LED0=1;
}
if(PAin(1)==1)
{
TIM2->CCER|=1<<5;//改为下降沿捕获
bHStatus |= BIT1;
// LED1=0;
}
else
{
TIM2->CCER|=~(1<<5);//上升沿捕获
// LED1=1;
}
if(PAin(2)==1)
{
TIM2->CCER|=1<<9;//改为下降沿捕获
bHStatus |= BIT0;
// BEEP=1;
}
else
{
TIM2->CCER|=~(1<<9);
// BEEP=0;
}
bHallStartStep=bHallSteps[0][bHStatus];//得到初始相位
if(bHallStartStep==7)
{
return;
}
TIM2->SR&=0XFFF1;//清除捕获标志位
TIM2->DIER|=0X0E<<0;//允许捕获输入中断
ComHandler();
}
void TIM2_IRQHandler(void)//捕获输入中断函数
{
u8 bHStatus = 0;
if(PAin(0)==1)
{
TIM2->CCER|=1<<1;//改为下降沿捕获
bHStatus |= BIT2;
// LED0=0;
}
else
{
TIM2->CCER&=~(1<<1);//上升沿捕获
// LED0=1;
}
if(PAin(1)==1)
{
TIM2->CCER|=1<<5;//改为下降沿捕获
bHStatus |= BIT1;
// LED1=0;
}
else
{
TIM2->CCER&=~(1<<5);//上升沿捕获
// LED1=1;
}
if(PAin(2)==1)
{
TIM2->CCER|=1<<9;//改为下降沿捕获
bHStatus |= BIT0;
// BEEP=1;
}
else
{
TIM2->CCER&=~(1<<9);//上升沿捕获
// BEEP=0;
}
TIM2->SR&=0XFFF1;//清除中断标志位
bHallStartStep = bHallSteps[0][bHStatus];//正转步序
if (bHallStartStep == 7)
{
TIM8->BDTR&=0<<15;//禁止PWM输出
PWM_A=0;
PWM_B=0;
PWM_C=0;//下桥臂关
return;
}
ComHandler();
return;
}
void ComHandler(void)//换相子函数
{
TIM8->BDTR&=0<<15;//
HALLcount++;
if(bHallStartStep!=3&&bHallStartStep!=4)
PWM_A=0;
if(bHallStartStep!=0&&bHallStartStep!=5)
PWM_B=0;
if(bHallStartStep!=1&&bHallStartStep!=2)
PWM_C=0;
if(bHallStartStep==0)//AB
{
TIM8->CCER|=1<<0; //OC1 输出使能
TIM8->CCER&=0<<4; //OC2 输出失能
TIM8->CCER&=0<<8; //OC3 失能
TIM8->CCR1=led0pwmval;
PWM_B=1;
LED0=0;
LED1=0;
BEEP=0;
}
else if(bHallStartStep==1) //AC
{
TIM8->CCER|=1<<0; //OC1 输出使能
TIM8->CCER&=0<<4; //OC2 输出失能
TIM8->CCER&=0<<8; //OC3 失能
TIM8->CCR1=led0pwmval;
PWM_C=1;
LED0=1;
LED1=0;
BEEP=0;
}
else if(bHallStartStep==2) //BC
{
TIM8->CCER&=0<<0; //OC1 输出失能
TIM8->CCER|=1<<4; //OC2 输出使能
TIM8->CCER&=0<<8; //OC3 失能
TIM8->CCR2=led0pwmval;
PWM_C=1;
LED1=1;
LED0=1;
BEEP=0;
}
else if(bHallStartStep==3) //BA
{
TIM8->CCER&=0<<0; //OC1 输出失能
TIM8->CCER|=1<<4; //OC2 输出使能
TIM8->CCER&=0<<8; //OC3 失能
TIM8->CCR2=led0pwmval;
PWM_A=1;
LED1=1;
LED0=0;
BEEP=0;
}
else if(bHallStartStep==4)//CA
{
TIM8->CCER&=0<<0; //OC1 输出失能
TIM8->CCER&=0<<4; //OC2 失能
TIM8->CCER|=1<<8; //OC3 使
TIM8->CCR3=led0pwmval;
PWM_A=1;
// BEEP=1;
LED0=0;
LED1=1;
}
else if(bHallStartStep==5) //CB
{
TIM8->CCER&=0<<0; //OC1 输出失能
TIM8->CCER&=0<<4; //OC2 失能
TIM8->CCER|=1<<8; //OC3 使能
TIM8->CCR3=led0pwmval;
PWM_B=1;
LED0=1;
// BEEP=1;
LED1=0;
}
TIM8->BDTR|=0x8000; //允许PWM输出
}
[/mw_shl_code] |
|