📄 ddc.c
字号:
#include "ddc.h"
void InitHardware(void)
{
di();
PIE1 = 0x00; //所有中断禁用
//端口设置初始化
TRISB = 0x01; //RB1~7 口输出,RB0输入
UVWOUT = 0x02; //关所有MOS管
TRISC = 0x70; //0x79; //设置C口,RC1/2/7/输出,其余输入 0111 1001
TRISA = 0xff; //设置RA口全部输入
//AD初始化
//ADCON1 = 0x04; //RA0,RA1,RA3为模拟量口,其余为数字IO,参考电压为Vdd,左对齐,8位AD
//ADCON0 = 0x81; //AD时钟为32分频,且AD开启,选择AN0通道采集相电流
//ADIF = 0;
//ADIE = 1; //AD中断使能
ADCON1=0X07; // all RA are digit I/O
//PWM及TIMER2初始化
CCP1CON = 0x0f; //CCP1设置为PWM方式
CCPR1L = 0x0; //初始时PWM占空比为0
CCP1X = 0; //ccp1con<5>
CCP1Y = 0; //ccp1con<4>
PR2 = 0xff; //PWM频率设置为15.6 kHz T=0.064ms=(ff+1)*4*1*1*(1/16Mhz)
T2CON = 0x0; //TMR2 预分频为1:1
TMR2 = 0x0; //TMR2寄存器初始化
TMR2IF = 0; //当TMR2=PR2时,同时也产生中断,因此使用TMR2中断来启动AD转换
TMR2IE = 1; //enable pwm interrupt
OPTION = 0x8c; //禁止上拉,WDT16分频,RB0下降沿中断
TMR2ON = 1; //硬件初始化完毕后,TIMRE2启动,64us中断将开始
INTCON = 0xc0; //中断设置GIE=1,PEIE=1,INTE=0,INTF = 0;
}
unsigned char U8Globe_Out[8] = {0x02, 0x8a, 0x32, 0x2a, 0x46, 0x86, 0x52, 0x02}; /*120*/
unsigned char current_pwm_value=0;
static unsigned int Counter64us=0;
static unsigned int U8Counter64us; //1ms扫描周期计数
unsigned char CurHallX, CurHallY, U8PwmDuty, CurDrvHall,U8LastHall =0xff,OutTmp;
bit T_flag=0;
bit acc_flag=0;
bit dec_flag=0;
unsigned char Time_ct=0;
void delay6us(void);
main()
{
InitHardware();
current_pwm_value=0x00;
PORTB=0XFF;
ei();
PORTC=0XFF;
while(RA3){;}
T_flag=0;
U8Counter64us=0;
while(!T_flag){;}
// UVWOUT=U8Globe_Out[((HALL_PIN_456 & HALL_STATE_456)>>4)];
for(current_pwm_value=0x20;current_pwm_value<0xfb;)
{
if(T_flag)
{
current_pwm_value++;
T_flag=0;
}
}
// ei();
while(1)
{
CLRWDT();
NOP();
NOP();
NOP();
if(RA3)
{
NOP();
NOP();
dec_flag=1;
Time_ct=0;
}
else
{
NOP();
if (dec_flag)
{
NOP();
dec_flag=0;
if(acc_flag)
{current_pwm_value=current_pwm_value+0x08;
if (current_pwm_value>0xf0) acc_flag=0;
}
else if(current_pwm_value>0x28)
{current_pwm_value=current_pwm_value-0x10;
acc_flag=1;
}
}
}
}
}
//64us interrupt once
void CommutationInSpect(void)
{
static unsigned char U8CommutationCounter; //hall滤波计数器,680us内若发现hall变化则忽略
NOP();
CurHallX = (HALL_PIN_456 & HALL_STATE_456); //读霍尔状态
NOP();
if (U8CommutationCounter < 255) U8CommutationCounter ++;
U8Counter64us ++;
if(U8Counter64us>15)
{
U8Counter64us=0;
T_flag=1;
}
Counter64us ++;
if (Counter64us>=10000){Counter64us=0;
PORTC=(PORTC^0X80);
}
if ((U8CommutationCounter > 10) && (CurHallX != U8LastHall))
{
NOP();
NOP();
CurHallY =(HALL_PIN_456 & HALL_STATE_456);
if (CurHallX == CurHallY)
{
LOAD_PWMDUTY(0);
CCP1X = 0;
CCP1Y = 0;
UVWOUT=0X02;// CLOSE ALL MOS
delay6us();
U8LastHall = CurHallX;
CurDrvHall = (CurHallX >> 4);
U8CommutationCounter = 0;
OutTmp = U8Globe_Out[CurDrvHall];
UVWOUT=OutTmp;
}
}
U8PwmDuty=current_pwm_value;
LOAD_PWMDUTY (U8PwmDuty);
}
void interrupt pro_int(void)
{
if ((FLAG_TMR2_OUT_INT) && (EN_TMR2_OUT_INT))
{
FLAG_TMR2_OUT_INT=0;
CommutationInSpect();
}
}
void delay6us(void)
{
unsigned char k;
for(k=0;k<8,k++;){;}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -