?? 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 + -