⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wushua.c

📁 电动车程序和原理图,该程序和原理已经批量生产,由于不同的电机会有差异,使用时要重新进行一些参数的调整,该程序也可作为一般直流无刷电机驱动程序,具有低成本高性能的特点
💻 C
📖 第 1 页 / 共 2 页
字号:
void	AD_Sample(void)
	{
//		if(AD_Turn==0)
			{
				Power_Voltage=AD_Convert(AD_CHNNEL0);		//采样电源电压
			}
//		else if(AD_Turn==1)
			{
				Speed_Voltage=AD_Convert(AD_CHNNEL1);		//采样速度电压
			}
		AD_Turn++;
		if(AD_Turn==2) AD_Turn=0;
//%%%%%%%%%%%%%%%%%%%%%%%
				if(Power_Voltage>PWR_3_HIGH){PWR_LED3=1;}
		else 	if(Power_Voltage<=PWR_3_LOW)	{PWR_LED3=0;}
				if(Power_Voltage>PWR_2_HIGH)
					{

						PWR_LED2=1;
					}
		else 	if(Power_Voltage<=PWR_2_LOW)	{PWR_LED2=0;}
				if(Power_Voltage>PWR_1_HIGH)
					{
						Pwr_Up_Num++;
						if(Pwr_Up_Num>200)
							{
							Pwr_Low_Count=0;
							PWR_LOW_STA=0;	//退出正式欠压状态
							Pwr_Low_Num=0;
							Pwr_Up_Num=0;
							}
						PWR_LED1=1;
					}
		else 	if(Power_Voltage<=PWR_1_LOW)
					{
						PWR_LED1=0;
					}
				if(Power_Voltage>PWR_0_HIGH)
					{
						if(PWR_LOW)			//欠压状态
							{
								PWR_LOW=0;
								Pwr_Low_Count++;
								if(Pwr_Low_Count>20)
									{
										PWR_LOW_STA=1;	//进入正式欠压状态
										ZHULI=1;
										DIANDONG=0;
										DINGSU=0;
									}
							}
						Pwr_Low_Num=0;
						PWR_LED0=1;
					}
		else	if(Power_Voltage<=PWR_0_LOW)	
			{
				PWR_LED0=0;
				if(WORK_STA)
					{
					Pwr_Low_Num++;
					if(Pwr_Low_Num>100)		
						{
							PWR_LOW=1;
							Pwr_Low_Num=0;
						}
					Pwr_Up_Num=0;
			}		}
		if(!WORK_STA)	Main_Flag1=0;
//%%%%%%%%%%%%%%%%%%%%%%%
		if(BREAK_ST||PWR_LOW_STA)	
			{
				Pwm_Duty=0;
				Zhuli_Duty=0;
				Zhuli_Count=0;
				Zhuli_Count1=0;
				Zhuli_Count2=0;
			}		//刹车状态duty=0
		else if(PWR_LOW)			//欠压不输出
			{
			Pwm_Duty=0;
			}
		else if(DINGSU)
			{
				Pwm_Duty=DS_Pwm_Duty;
			}

		else if(ZHULI)		//在助力状态
			{
				if(!DIANDONG)
					{
						Old_ZL_Duty=Pwm_Duty;
						if(Zhuli_Duty<1)		Pwm_Duty=0;
						else if(Zhuli_Duty<15)	Pwm_Duty=64+6*Zhuli_Duty;
						else	Pwm_Duty=158;
						if(Pwm_Duty<Old_ZL_Duty&&Pwm_Duty!=0)
							{
								Pwm_Duty=Old_ZL_Duty-2;
							}
					}
			}
		else //if(DIANDONG)	//不在定速状态
			{
				if(Speed_Voltage<=START_RUN) 
					{
						if(Pwm_Duty>3) Pwm_Duty-=1;  
						else Pwm_Duty=0;
						CUR_LIMIT=0;
						CUR_OVER=0;
					}
				if(Speed_Voltage>START_RUN)
					{
					if(WORK_STA)
						{
							Pwm_Duty=(Speed_Voltage-40);
							if(Pwm_Duty>DS_Pwm_Duty)
								{
									if(Pwm_Duty-DS_Pwm_Duty>3)
										{
											Pwm_Duty=DS_Pwm_Duty+2;
										}
								}
							if(Pwm_Duty>157)	Pwm_Duty=158;
						}
					if(PWR_ON)
						{
							ERR_SPEED=1;
							WITH_ERR=1;
							Time_Err_Speed=255-Speed_Voltage;
							Time_Err_Speed>>=1;
						}
					}
				DS_Pwm_Duty=Pwm_Duty;
			}
		if(ERR_SPEED)
			{
				Pwm_Duty=0;
				if(Speed_Voltage<75)
					{
						ERR_SPEED=0;
						Disp_Data_Old=0x55;
					}
			}
		if(Speed_Voltage<60)
			{
				Time_Motor_Ph=0;
			}
		if(Time_Motor_Ph>50)
			{
				Pwm_Duty=0;
				 CUR_OVER=0;
				 CUR_LIMIT=0;
			}
		Pwm_High=Pwm_Duty;
		if(!UP_SPEED)		//速度极限控制在80%
			{
				if(Pwm_Duty>135)
					{
						Pwm_Duty=135;	//速度极限控制在86%
					}
			}
		if(Pwm_Old>Pwm_High)	
			{
				if(Pwm_Old-Pwm_High>40)
					{
						 CUR_OVER=0;
						 CUR_LIMIT=0;
				 		 Pwm_Old=Pwm_High;
				 	}
			}

		if(CUR_LIMIT)		//限流状态, Duty=1/2 Duty
			{
				if(CUR_OVER)
					{
						if(Pwm_Low>Pwm_Old-65)
							{
							if(Time_Motor_Ph>2) {Pwm_Low-=1;}
							else	Pwm_Low-=2;
							}
						else 
							{
								Pwm_Low=Pwm_Old-65;
							}
						CCPR1L=Pwm_Low;
					}
				else
					{
						if(CCPR1L>65)
							{	
								CUR_OVER=1;		//Current over status
								if(Pwm_High>135) Pwm_High=135;
								Pwm_Old=Pwm_High;
								Pwm_Low=CCPR1L;//Pwm_High/2;//-Pwm_High/3;
								CCPR1L=Pwm_Low;
							}
					}
			}
		else
			{
				if(CUR_OVER)
					{
						if(Pwm_Low<Pwm_Old)
							{
							Pwm_Low+=1;
							}
						if(Pwm_Low>CCPR1L)
							{
								if(Pwm_Low-CCPR1L>3)  CCPR1L+=3;
								else 				  CCPR1L=Pwm_Low;
							}
						else	CCPR1L=Pwm_Low;
					}
				else
					{
						if(Pwm_Duty>CCPR1L)
							{
								if(Pwm_Duty-CCPR1L>3) CCPR1L+=3;
								else 				  CCPR1L=Pwm_Duty;
							}
						else
							{
								CCPR1L=Pwm_Duty;
							}
					}
			}
	}
//*************************************************
//
//		助力霍尔检测子程序
//
//*************************************************
void	Zhuli_Hall_DTC(void)
	{
		if(ZHULI_DTC)
			{
				Zhuli_High++;
				if(Zhuli_High>100) Zhuli_High=2;
				if(Zhuli_High==2)
					{
						Zhuli_Low_Bak=Zhuli_Low;
						Zhuli_Low=0;
						if(Zhuli_Low_Bak>1&&Zhuli_High_Bak>4&&Zhuli_High_Bak>Zhuli_Low_Bak+3)
							{	
								if(ZHULI)					//助力状态
									{
										Zhuli_Count++;		//正转有效
									}
							}
					}
			}
		else
			{
				Zhuli_Low++;
				if(Zhuli_Low>100) Zhuli_Low=2;
				if(Zhuli_Low==2)
					{
						Zhuli_High_Bak=Zhuli_High;
						Zhuli_High=0;
						if(Zhuli_High_Bak>1&&Zhuli_Low_Bak>4&&Zhuli_Low_Bak>Zhuli_High_Bak+3)
							{
								NOP();
							}
					}
			}
		if(TIME_ZHULI_OK)	//助力信号检测1s到
			{
				Zhuli_Duty=(Zhuli_Count+Zhuli_Count1+Zhuli_Count2);
				Zhuli_Count2=Zhuli_Count1;
				Zhuli_Count1=Zhuli_Count;
				TIME_ZHULI_OK=0;
				Zhuli_Count=0;
			}
	}
	
//*************************************************
//
//		换相处理子程序
//
//*************************************************
void	Change_Phase(void)
	{
		
		Phase_Dtc=PORTB;
		Phase_Dtc>>=4;
		Phase_Dtc&=0x07;
		if((!WORK_STA)||BREAK_EN)
			{
				Phase_Dtc_Old=0;
				PORTC=PHASE_DATA[0];
			}
		else
			{
				if(Phase_Dtc!=Phase_Dtc_Old)
					{
						Phase_Dtc_Old=Phase_Dtc;
						PORTC&=0xFB;
						
						if(Time_Motor_Ph<=50)
							{
								Phase_Ch_Count1++;
								if(Phase_Ch_Count1>8)
									{
										Phase_Ch_Count1=0;
										Time_Motor_Ph=0;
										Phase_Ch_Count=0;
									}
							}
						if(Time_Motor_Ph>50)
							{
								Phase_Ch_Count++;
							}
						if(Phase_Ch_Count>5)
							{			
								Time_Motor_Ph=0;
								Phase_Ch_Count=0;
							}
						
 						PORTC=PHASE_DATA[Phase_Dtc_Old];
					}
			}
	}	
	
//*************************************************
//
//		主程序
//
//*************************************************
void     main(viod)
	{
        Initial();
        PWR_ON=1;			//首次上电标志
		ADON=1;
		Phase_Dtc_Old=0xAA;
		Disp_Data_Old=0xAA;

LOOP:
		if((!WORK_STA)&&(!PWR_ON))
		{
			if(!WITH_ERR)
			{
				if((Main_Flag2&0xE0)==0)
					{
						WORK_STA=1;			//开锁后开始运行标志
						DINGSU=0;
						DIANDONG=1;			//在电动状态
						ZHULI=0;
					}
			}
		}
		if(WITH_ERR) PWR_ON=1;
			
        CLRWDT();
        Change_Phase();
        if(MS_1_OK)
        	{
	        	MS_1_OK=0;
		        if(!CURRENT)
			        {
				    	CUR_LIMIT=1;
				    	Current_High++;
				    	Cur_Over_Count=0;
					}
				else
			        {
				    	CUR_LIMIT=0;
				    	Current_High=0;
				    	Cur_Over_Count++;
				    	if(Cur_Over_Count>100)
				    		{
					    		Cur_Over_Count=100;
					    		CUR_OVER=0;
					    	}
					}
			
	        }
        if(MS_5_OK)
        	{
	        	GIE=0;
	        	MS_5_OK=0;
		        AD_Sample();
	        	Led_Display();
	        	Key_Dtc();
				Zhuli_Hall_DTC();
		        if(KEY_PRO_EN)	Key_Process();
		        GIE=1;
   		  	}
        goto LOOP;
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -