📄 pic16f73inductionprocedures.c
字号:
//保存TMR1的设置值
uCON = T1CON;
TMR1ON = 0;
TMR1IF = 0;
TMR1IE = 0;
uTMRL = TMR1L;
uTMRH = TMR1H;
RC2 = 0;
asm("nop");
//CCP1,RC2
//设置RC2为输入管脚
TRISC |= 0x04; //"00000100"
//延时25ms
PIC_Timer(3,2);
while(gTimerOver != 1);
gPlusNum = PLUSCOUNT; //需要采取的上升沿个数
gPlusNo = 0x00; //清零
gRevPlus = 0x00; //收到的脉冲数清零
CCP1CON = 0x00;
T1CON = 0x00; //1:1
TMR1L = 0;
TMR1H = 0;
//设置CCP1CON
CCP1IF = 0;
CCP1IE = 1;
CCP1CON = 0x05;
TMR1ON = 1;
//发试探脉冲
Send_Test_Plus();
//定时160us
PIC_Timer(2,8);
//当收到的脉冲数等于MAXPLUSNUM时,同时或者定时时间到,退出循环
while((gTimerOver == 0) && (gRevPlus < MAXPLUSNUM));
//不是定时时间到而退出循环的,关闭定时器
if(gTimerOver == 0)
{
T0IE = 0;
}
//关闭捕捉功能
CCP1CON = 0x00;
CCP1IE = 0;
TMR1ON = 0;
//恢复TMR1的值设置
TMR1IF = 0;
TMR1IE = 1;
TMR1L = uTMRL;
TMR1H = uTMRH;
T1CON = uCON;
TRISC &= 0x0fb; //11111011
asm("nop");
RC2=1;
}
#pragma interrupt_level 1
void interrupt INT_Service_Prog(void)
{
uint uDelay;
uchar uSwOne;
uchar uSwTwo;
if(T0IF == 1) //是tmr0中断
{
T0IF = 0; //清楚中断标志
--gTimerNum; //定时个数减一
if(gTimerNum == 0) //延时时间是否到,
{
gTimerOver = 1; //是,置标志位
T0IE = 0; //关闭定时器中断
}
else
TMR0 = gTimerDur; //否,继续置定时器时间常数
}
if(CCP1IF == 1) //是capture中断
{
CCP1IF = 0; //清除中断标志
if(gPlusNum != 0) //需要capture的次数是否到了
{ //没有,记录相关的数据
gCAPU.uY[0] = CCPR1L; //CCPR1L;
gCAPU.uY[1] = CCPR1H; //CCPR1H;
gCPLZ[gPlusNo] = gCAPU.iX;
gPlusNo++;
gPlusNum--;
}
gRevPlus++; //收到的脉冲数加1
PIC_Timer(2,8); //定时器重新开始定时160us
}
else if(TMR1IF == 1) //是tmr1中断
{
TMR1IF = 0;
TMR1L = TMR1LOW;
TMR1H = TMR1HIGH;
d01ms++;
t1ms++;
if (d01ms>=10)
{ d01ms=0; d10ms++;
t750ms++; t10ms++;
t120ms++;
if(d10ms>=10)
{ d10ms=0 ; d100ms++;
t01s++;
if (d100ms>=10)
{ d100ms=0;d01s++;
t1s++; t2s++; t3s++;
if (d01s>=60)
{ d01s=0; d60s++;
if( d60s>=60)
{ d60s=0; d01h++;
}
}
}
}
}
}
else if(INTF == 1) //开关状态发生改变
{
INTF = 0; //清除中断标志
uSwOne = PORTB & switchSHIELD; //读开关的值
if( uSwOne != gOldSwitch) //判断是否与原来的值相等
{
for(uDelay=0;uDelay<300;uDelay++); //不相等,等待一段时间后,重新读取
uSwTwo = PORTB & switchSHIELD;
if(uSwOne == uSwTwo) //前后两次的值是否相等
{
gNowSwitch = uSwOne; //如相等,则认为开关状态已经发生变化
gDoCircle = FALSE; //设定重新循环的标志
bKeyChange = TRUE ; //*加热状态改变
}
}
}
}
//uKind = 1,以8us为基准
//uKind = 2,以20us为基准
//否则以10ms为基准
#pragma interrupt_level 1
void PIC_Timer(uchar uKind,uchar uNum)
{
T0IF = 0;
T0IE = 1;
//如定时60us,3×20us,为3次
gTimerNum = uNum;
//定时时间到,开始为"0",结束为"1"
gTimerOver = 0;
//不是发试探脉冲定时
// gIsPlus = FALSE;
if(uKind == 1)
{
OPTION &= 0x0F8;
gTimerDur = DEFus;
}
else if(uKind == 2)
{
OPTION &= 0x0F8;
gTimerDur = DEF20us;
}
else
{
OPTION |= 0x07;
gTimerDur = DEF10ms;
}
//TMR0的初始值
TMR0 = gTimerDur;
}
//此函数发试探脉冲
//试探脉冲的宽度是6us
void Send_Test_Plus(void)
{ uchar i;
bPLUS = 0;
for(i=6;i>0;i--);
bPLUS = 1;
for(i=2;i>0;i--);
bPLUS = 0;
for(i=6;i>0;i--);
}
void Send_IGBT_Plus(unsigned int PWM_hi)
{
unsigned int uHi,ss;
PR2 = PWM_period;
uHi = PWM_hi;
ss=uHi & 0x03fc;
CCPR2L = (ss >> 2);
ss=uHi & 0x0003;
CCP2CON |= ((ss <<4) & 0x0030); //CCP2CON<5:4>=0;
T2CON = 0x01; // 1/4 frequency
CCP2CON |= 0x0C; //PWM mode
T2CON |= 0x04; //打开TMR2
}
uchar ad_out(uchar uchannel)
{ int iT;
ADCON0=uchannel;
ADCON0 |=0X01;
for(iT=0; iT<60; iT++) ;
ADCON0 |= 0X04;
asm("NOP");
asm("NOP");
while((ADCON0&0X04)==0X04) ;
asm("NOP");
asm("NOP");
ADCON0 &=0X0FE;
return(ADRES);
}
void DISPLAY1(uchar shu1, uchar shu2)
{ char ucdata,ucI,ucshi,ucge;
ucshi=shu2;
ucge =shu2;
bSDATA = 0;
bSDCLK = 0;
bSCLK = 0;
ucdata=table[ucge];
for(ucI=0;ucI<8;ucI++)
{ if (ucdata & 0x80)
bSDATA=1;
else
bSDATA=0;
asm("NOP");
asm("NOP");
bSDCLK=1;
asm("NOP");
asm("NOP");
bSDCLK=0;
ucdata &= 0x07f;
ucdata <<= 1;
}
ucdata=table[ucshi];
for(ucI=0;ucI<8;ucI++)
{ if (ucdata & 0x80)
bSDATA=1;
else
bSDATA=0;
asm("NOP");
asm("NOP");
bSDCLK=1;
asm("NOP");
asm("NOP");
bSDCLK=0;
ucdata &= 0x7f;
ucdata <<=1;
}
bSCLK=0;
asm("NOP");
asm("NOP");
bSCLK=1;
}
void Mcu_init(void)
{ ADCON1 = 0x00; //Vref+=VDD,Vref-=VSS,所有的都是A/D口
//87X,10位精度;7X,8位精度
//RA0:IGBT temperature:pin-2
//RA1:Voltage :pin-3
//RA2:Coil temperature:pin-4
//RA3:Current :pin-5
TRISA = 0x0DF; //A口全部为输入,用作A/D
TRISC = 0X08;
TRISB = 0x0F5; //RB0,RB4,RB5,RB6,RB7 input,others output
Low_PWM_Output(); //IGBT的驱动脉冲,不工作时为低电平
//测试脉冲为低电平,以防止意外
T1CON=0X00;
PIR1=0X00;
INTCON=0X00;
TMR1L = TMR1LOW;
TMR1H = TMR1HIGH;
TMR1IE=1;
INTCON = 0x00;
OPTION = 0x0C0; //RB0/INT上升沿触发, 并禁止弱上拉
INTE = 1; //允许外部中断(开关)
PEIE = 1; //允许其他外设中断
GIE = 1; //允许全局中断
TMR1ON=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -