#include "HT66FM5240.h"
#include "FuncTion.h"
void SystemInit(void)
{
ClockInit();
GPIOInit();
PwmInit();
//CaptmInit();
//ProtectInit();
HallInit();
ADInit();
WatchDogInit();
}
void ClockInit(void)
{
_smod=0x01; //禁止快速喚醒功能、禁止IDLE模式 Fsys=Fh=20MHZ
while((_smod&0x04)==0); //等待時鐘穩定
}
void GPIOInit(void)
{
_papu6=0; //未上拉
_pac6=0; //端口設為輸出模式
_pa6=1; //端口輸出高電平
_papu3=1; //上拉
_papu4=1; //上拉
_papu5=1; //上拉
}
void WatchDogInit(void)
{
_wdtc=0x57; //IDLE模式時維持Fsys時鐘、看門狗時間=2^18/Fs (Fs=Fsub、Fs=Fsys/4)
}
/****************PWM初始化************************/
void PwmInit(void)
{
_pcps0=0xAA; //C引腳共用功能設置 PC0-PC5設為PWM口
_pcps1=0x0A;
_pwmc=0x81; //中心對齊模式1、 Fpwm=20MHZ、禁止占空比中斷、允許更新
_prdrh=(u8)(PWMPERIOD>>8); //設置週期寄存器
_prdrl=(u8)(PWMPERIOD);
_dutr0h=0x00; //占空比寄存器
_dutr0l=0x00;
_dutr1h=0x00;
_dutr1l=0x00;
_dutr2h=0x00;
_dutr2l=0x00;
_pwmme=0x3F; //禁止PWM輸出
_pwmmd=0x00; //強制輸出電平寄存器 強制輸出低電平
#ifdef SW_MASKMODE
_mcf=0x8D; //Bit7:S/W Mask 模式、Bit3:非互補輸出、Bit2:PWM輸出使能、Bit1:保護時輸出為0、Bit0:頂端PWM輸出
#else
_mcf=0x0D; //Bit7:H/W Mask 模式、Bit3:非互補輸出、Bit2:PWM輸出使能、Bit1:保護時輸出為0、Bit0:頂端PWM輸出
#endif
_dts=0xA4; //使能死區、死區時間為1us
_plc=0x00; //極性為正相輸出
_pwmpf=0; //清除PWM週期中斷標誌
_pwmpe=1; //允許PWM週期中斷
_mf2f=0; //清除多功能2中斷標誌
_mf2e=1; //允許多功能2中斷
_pwmc|=0x08; //開啟PWM計數器
}
void SetDuty(u16 duty)
{
if(duty>MAX_PWM) //PWMPERIOD
{
duty=MAX_PWM;
}
_dutr0h=(u8)(duty>>8); //設置占空比寄存器
_dutr0l=(u8)(duty);
_dutr1h=(u8)(duty>>8);
_dutr1l=(u8)(duty);
_dutr2h=(u8)(duty>>8);
_dutr2l=(u8)(duty);
}
/*****霍爾初始化*****/
void HallInit(void)
{
_integ0=0x3f; //Hall中斷源選擇H1、H2、H3、雙邊沿中斷
#ifdef HALL_DELAY
#ifdef HW_MASKMODE_HALLMODE
_hdcr = 0x39; //Hall信號延遲TIM0做延遲計數器、120°、Hall傳感器模式、正轉、Hall傳感器解碼使能
#else
_hdcr = 0x31; //Hall信號延遲TIM0做延遲計數器、120°、S/W模式、正轉、Hall傳感器解碼使能
#endif
_ptm0c0=0x30; //計數時鐘選為系統時鐘=20MHZ/64(單位時間為3.2us)
_ptm0c1=0x01; //比較匹配模式、比較器A匹配時清零計數器
_ptm0al=(u8)(100); //設置比較器A的值(設置延遲時間)
_ptm0ah=(u8)(100>>8);
#else
#ifdef HW_MASKMODE_HALLMODE
_hdcr = 0xD9; //Hall信號無延遲、120°、Hall傳感器模式、正轉、Hall傳感器解碼使能
#else
_hdcr = 0xD1; //Hall信號無延遲、120°、S/W模式、正轉、Hall傳感器解碼使能
#endif
#endif
_hchk_num = 0x05; // Hall噪聲濾波次數為5(0-32)
_hnf_msel = 0x09; //使能噪聲濾波器、濾波器時鐘=fsys/4
_hdcd = 0x00; //Hall譯碼器輸入數據寄存器清零
#ifndef SW_MASKMODE
//AH、AL、BH、BL、CH、CL
_hdct0 = 0B00011000; //BH->AL 1
_hdct1 = 0B00010010; //CH->AL 3
_hdct2 = 0B00000110; //CH->BL 2
_hdct3 = 0B00100100; //AH->BL 6
_hdct4 = 0B00100001; //AH->CL 4
_hdct5 = 0B00001001; //BH->CL 5
_hdct8 = 0B00000110; //CH->BL 1
_hdct9 = 0B00100100; //AH->BL 3
_hdct10 = 0B00100001; //AH->CL 2
_hdct11 = 0B00001001; //BH->CL 6
_hdct6 = 0B00011000; //BH->AL 4
_hdct7 = 0B00010010; //CH->AL 5
#endif
#ifndef HW_MASKMODE_HALLMODE
_hallf_mf0f=0; //清除Hall總中斷標誌
_halle_mf0e=1; //允許Hall總中斷
//_mfi0=0x07; //允許HA、HB、HC中斷
_halaf=0; //清除HA中斷標誌
_halbf=0; //清除HB中斷標誌
_halcf=0; //清除HC中斷標誌
_halae=1; //使能HA中斷
_halbe=1; //使能HB中斷
_halce=1; //使能HC中斷
#endif
}
/****************保護初始化(過流、限流、堵轉)********************/
void ProtectInit(void)
{
_pa1s0=1; //引腳共用功能設置 (設置成AP功能)PA1--AP
_pa1s1=0;
_opoms=0x47; //比較器上升沿有效、內部運放放大1倍 //0x42-10倍
_opcm=150; //DA比較寄存器值過流電壓為3V
//_opacal=0x00; //工作在比較器或運算放大器模式
_mptc1=0x1C; //禁止軟件關斷功能、使能過流保護、使能限流保護、使能堵轉保護
_mptc2=0x1F; //軟件保護、過流保護、限流保護、堵轉保護都選擇Phase模式
_c0f=0; //清除比較中斷標誌位
_c0e=1; //允許比較中斷
_cpc|=0x11; //開啟比較器0、使能遲滯功能
}
/***************捕捉定時器初始化************************/
void CaptmInit(void)
{
_captc0=0x00; ///計數時鐘選為PWM週期時間(64us)、捕捉通道選為H1
_captc1=0xF7; //選擇雙邊沿捕捉、使能捕捉、噪聲濾波採樣四次、CAPTM 噪聲濾波器時鐘選為系統時鐘fSYS、濾波使能、CAPTM 計數器捕捉自動復位使能、CAPTM 計數器 比較匹配自動復位使能
_captmal=0xFF; //設置比較器的比較值 //堵轉時間設定
_captmah=0xFF;
_capcf=0; //清除比較匹配中斷標誌位
_capce=1; //允許比較匹配中斷
// _capof=0; //清除捕捉溢出中斷標誌位
// _capoe=1; //允許捕捉溢出中斷
_mf1f=0; //清除多功能1中斷標誌位
_mf1e=1; //允許多功能1中斷
//_captc0|=0x08; //啟動計數器
}
/*****************AD初始化**********************/
void ADInit(void)
{
_pd0s0=1; //引腳共用功能設置 (設置AD通道)PD0--AN5
_pd0s1=0;
_pd1s0=1; //引腳共用功能設置 (設置AD通道)PD1--AN4
_pd1s1=0;
_adcr1=0xDC; //選擇延遲觸發電路、使能延遲功能、PWM週期觸發AD、AD時鐘=Fsys/16、
//_adcr2=0x00; //選擇PWM占空比觸發的觸發源(pwm0、pwm1、pwm2)
_adcr0=0x16; //開啟AD電源、數據右對齊、初始通道選為AP(內部通道)
_addl=1; //AD觸發延遲80*0.05=4us
_adlvdl=0x00; //設置AD值窗口限制值(初始限流值)
_adlvdh=0x00;
_adhvdl=0x66; //設置AD值窗口限制值(初始限流值) 3v
_adhvdh=0x06;
_aeocf=0; //清除AD轉換結束標誌
_aeoce=1; //允許AD轉換結束中斷
// _alimf=0; //清除窗口比較中斷標誌
// _alime=1; //允許窗口比較中斷
_mf1f=0; //清除多功能1中斷標誌
_mf1e=1; //允許多功能1中斷
}
u16 AdSample_1(u8 channel)
{
u16 temp;
//u8 templ,temph;
_aeoce=0; //禁止AD轉換結束中斷
_adcr1 &=0x7F; //不選擇延遲觸發電路
_adcr0 &=0xF0;
_adcr0 |=channel;
_adstr=0;
_adstr=1;
_adstr=0;
while(_eocb); //等待轉換結束
/*
templ=_adrl;
temph=_adrh;
temp=(temph<<8)|templ;
*/
temp=_addata;
_adcr1 |=0x80; //選擇延遲觸發電路
_adcr0 &=0xF0;
_adcr0 |=CURRENT_CHAN;
ChannelCnt=0;
_aeocf=0; //清除AD轉換結束標誌
_aeoce=1; //允許AD轉換結束中斷
return temp;
}
评论4