带有零点检测的可控硅控制马达(笔记)

#define MOTOR_ON() PB3=0
#define MOTOR_OFF() PB3=1

#define SYNC PB0 //零点检测

#define HEAT_ON() PORTAbits.PA6=0
#define HEAT_OFF() PORTAbits.PA6=1

#define uint unsigned int
#define uchar unsigned char

#define Half_Cycle 100

	//马达结构体初始化
	struct
	{
		uchar MOT_ZeroCroFlag :1;			//过0标志位
		uchar MOT_FLAG		  :1;		//马达工作标志位
		uchar :6;
		uchar MOT_cnt;						//马达计数
	}MOT={0,0,0,0};

//硬件初始化
void HARD_INIT()
{	

	IOSTB  = 0xF1;	   //PB1 PB2 PB3输出

	//输出IO应用全关

	MOTOR_OFF();
	MOT.MOT_FLAG = 0;
	//定时器0  1US 溢出一次要50us
  	TMR0 = 0XCE;				//206
  	T0MD = C_PS0_Div4;
	PCON1 = C_TMR0_En;				//打开定时器0
	INTE  |= C_INT_TMR0;

	//定时器1初始值为1000;
	TMRH  = C_TMR1_Data_b9 | C_TMR1_Data_b8;
	TMR1  = 0xe8;
	T1CR1 = C_TMR1_En | C_TMR1_Reload;		//打开定时器 自动重装
	T1CR2 = C_PS1_Div4;						//四分频
	INTE |= C_INT_TMR1;						//使能定时器1中断 
}


void Delay_ms(uint delay_time)	//延迟函数
{
			flag.time_delay_flag =			1;
			time_num		=  delay_time;
			while(time_num );	//等待标志位置0退出循环
			flag.time_delay_flag =			0;
}
void Delay_50us(uchar delay_us)
{
			flag.time_delay_flag  =			1;
			time_num		 =	delay_us ;
			while(time_num);   //等待标志位置0退出循环
			flag.time_delay_flag  =			0;
}

//--------------- Global Definition ----------------------------------------
//--------------------------------------------------------------------------
//uint time_ms = 0;

//外部中断初始化
void INT0_Init()
{
INTEDG = C_INT0_En |C_INT0_FallingEdge ; //下降沿触发 外部中断0
INTE |= 0x04; //使能INT0中断
}
//定时器0初始化
void Time0_Init()
{
//定时器0 初始值155 4分频 4M/4 = 1M = 1US 溢出一次要50us
TMR0 = 0XCE; //206
T0MD = C_PS0_Div4;
PCON1 = C_TMR0_En; //打开定时器0
INTE |= C_INT_TMR0;

}

void Timer4_Init()
{
T4CR1 = 0x00;
TM4RH = 0x00;
TMR4 = 0x64; //赋初值0x64=100,下数到0产生下溢中断的时间为(100-0)*1us = 100us
T4CR1 = C_TMR4_Reload | C_TMR4_En;
T4CR2 = C_TMR4_ClkSrc_Inst | C_PS4_Div4; //4分频
INTE2bits.T4IE = 1; //打开定时器4
}

//定时器1初始化
void Time1_Init()
{
//定时器1初始值为1000;
TMRH = C_TMR1_Data_b9 | C_TMR1_Data_b8;
TMR1 = 0xe8;
T1CR1 = C_TMR1_En | C_TMR1_Reload; //打开定时器 自动重装
T1CR2 = C_PS1_Div4; //四分频
INTE |= C_INT_TMR1; //使能定时器1中断
}

void Motor_StartSoftlyCallBack(void)
{
if(MOT.MOT_ZeroCroFlag)
{
if(MOT.MOT_cnt < Half_Cycle) //第一次过零点出现,进入负半周期操作(<=10ms)
{
//想要控制马达功率,只需要修改下面值即可,周期为20ms
if(MOT.MOT_cnt == 5)MOTOR_ON(); //开启脉冲信号 //30
if(MOT.MOT_cnt == 95)
{
MOTOR_OFF(); //在过零点前关闭脉冲信号
}
}
else //第二次过零点出现,进入正半周期操作(>10ms & <= 20ms)
{

			if(MOT.MOT_cnt == 105)MOTOR_ON();	//开启脉冲信号		//130
			if(MOT.MOT_cnt == 195)
			{
				MOTOR_OFF();						//在过零点前关闭脉冲信号
				INTE2bits.T4IE = 0;							//关闭定时器4
				MOT.MOT_cnt = 0;
				MOT.MOT_ZeroCroFlag = 0;
			}												
		}
	}		

}

void Wait_SyncSignal()//等待同步信号
{
while(SYNC == 0);
//CLRWDT();
while(SYNC == 1);
//CLRWDT();
}

//--------------- Main function --------------------------------------------
//--------------------------------------------------------------------------
void main(void)
{

Time0_Init();
Time1_Init();
INT0_Init();*/
ENI(); 															//打开中断总开关

while(1)

{
//红外感应到马达工作
if(MOT.MOT_FLAG) //马达工作
{
Mot_Dri();
}

}

}

//--------------------------------------------------------------------------

//1s处理
void time_1s_handle()
{

time_100ms = 0;
time_1s++;
if(MOT.MOT_FLAG) //马达仍在工作
{
	if((--time_work_t) == 0) //没障碍后 三秒停止工作
		MOT.MOT_FLAG = 0;
}

}

void isr(void) __interrupt(0)
{
//定时器0

if(INTFbits.T0IF)
{
	  	TMR0 = 0XCE;
	
if(LED_Flash)
	LED_MODE_CH();
	if(flag.time_delay_flag)
	{
		time_num--;
	}
	INTFbits.T0IF = 0;
}
//定时器1
if(INTFbits.T1IF)
{
	time_1ms++;
	
	if(flag.time_delay_ms_flag)
	{
		time_num--;
	}
	if(time_1ms == 10)
	{
		time_10ms_handle(); 
		
		if(time_10ms == 10) 
		{ 
				time_100ms_handle();
					if(time_100ms == 10)
					{
							time_1s_handle();
							//每隔十秒工作三秒
						/*
							if(time_1s == 10)
							{
								MOT.MOT_FLAG? MOT.MOT_FLAG = 0:else MOT.MOT_FLAG = 1;
								time_1s = 0;
							}
						*/
					}	
				
		}
	}
	
	INTFbits.T1IF = 0;
}

if(INTFbits.INT0IF)
{
	
	if( MOT.MOT_FLAG )
		{
			MOT.MOT_ZeroCroFlag = 1;			//过0标志位
			MOT.MOT_cnt = 0;
			Timer4_Init();
		}	
	INTFbits.INT0IF = 0;	
}
if(INTE2bits.T4IF)
{
    INTE2bits.T4IF = 0;	
	
	if(MOT.MOT_ZeroCroFlag)MOT.MOT_cnt++;
	if(MOT.MOT_cnt > 200)MOT.MOT_cnt = 0;
	if(flag.Heat_flag)
		HEAT_ON();
	else
		HEAT_OFF();
	Motor_StartSoftlyCallBack();	//motor start
}

}
//---------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值