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

📄 ddc.c

📁 初学pic mcu c设计
💻 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 + -