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

📄 dcm.c

📁 基于DsPic30F4011的高精度位置伺服控制系统
💻 C
📖 第 1 页 / 共 2 页
字号:
	ADCON1bits.FORM = 3;	//有符号小数(DOUT = sddd dddd dd00 0000)
	ADCON1bits.SSRC = 3;	//通过电机控制PWM间隔结束采样并开始转换
	ADCON1bits.SIMSAM = 1;	//同时采样CH0、CH1、CH2 和CH3 (当CHPS = 1x时)
							//或
							//同时采样CH0 和CH1 (当CHPS = 01 时)
	ADCON1bits.ASAM = 1;	//采样在上一次转换结束后立即开始。SAMP 位自动置位
	ADCON1bits.SAMP = 1;	//至少一个A/D 采样/保持放大器正在采样
	
	ADCON2 = 0;
	ADCON2bits.CHPS = 2;	//转换CH0、CH1、CH2 和CH3	
	
	ADCON3 = 0;
	ADCON3bits.ADCS = 7;	//A/D 转换时钟选择位 = 4 * Tcy
	
	ADCHS = 0;
	ADCHSbits.CH0SA = 6;
	ADCHSbits.CH123SA = 0;	//CH1正输入为AN0, CH2 正输入为AN1,CH3正输入为AN2
	
	ADPCFG = 0xFFFF;		//将所有端口设置为数字端口
	ADPCFGbits.PCFG0 = 0;	// AN0 模拟
	ADPCFGbits.PCFG1 = 0;	// AN1 模拟
	ADPCFGbits.PCFG2 = 0;	// AN2 模拟
	
	ADCSSL = 0;
	
	ADCON1bits.ADON = 1;	//开启A/D 模块	
// ------------- 编码器 -----------------
	MAXCNT = diMAXCNTS;		//MAXCNT = 4096
	QEICON = 0;
	POSCNT = 0;
	QEICONbits.QEIM = 7;	//正交编码器接口使能(x4 模式),通过与(MAXCNT)匹配将位置计数器复位
	QEICONbits.POSRES = 0;	//索引脉冲不能使位置计数器复位
	QEICONbits.SWPAB = 1;	
	DFLTCON = 0; 

// ------------ 输入捕捉和变化通知 ------------------
	TRISB |= 0x38;		//
	CNPU1 = 0;			//
	
	CNEN1 = 0x20;		// Enable CN5

// ------------- 端口------------------
	TRISBbits.TRISB8 = 0;
	TRISBbits.TRISB7 = 0;
	TRISBbits.TRISB6 = 0;   //LED端口初始化为输出模式
	
	TRISCbits.TRISC14 = 1;	//此端口配合CN5,用来判断方向盘的旋转方向 
}

void RunMotor(void)
{
	// Clear all interrupts flags
	IFS0bits.CNIF = 0;	// Clear interrupt flag
	IFS0bits.ADIF = 0;		// Clear ISR flag
	//IFS2bits.QEIIF = 0;		// Clear ISR flag
	// enable all interrupts
	__asm__ volatile ("DISI #0x3FFF");
	//IEC0bits.T1IE = 1;	// Enable interrupts for timer 1
	IEC0bits.CNIE = 1;	// Enable interrupts on CN5
	//IEC2bits.QEIIE = 1;	// Enable interrupts on IC8
	IEC0bits.ADIE = 1;				// Enable interrupts
    DISICNT = 0;
    return;
}



//===========================================================
//名称: void init_led(void)
///
//说明:初始化LED和按键端口
//===========================================================
void Init_LedPort(void)
{
	TRISDbits.TRISD1 = 0;
	TRISDbits.TRISD2 = 0;
	TRISDbits.TRISD3 = 0; //数据发送端口方向
	
	TRISEbits.TRISE2 = 0;
	TRISEbits.TRISE3 = 0;
	TRISEbits.TRISE4 = 0; //
	TRISEbits.TRISE5 = 0; //控制位
}

//=========================================================
//名称:take_data
//描述:取字符代码子程序,从字库中取出字符代码
//入口参数:i为显示缓存中的第某位数据
//=========================================================
void take_data(unsigned char i)
{
    unsigned char j;
    j = Led_Show_Buf[i] ;			//取显示缓存的某位数据 
    Led_Show_Data=ledtable[j];     //从led字符表中查找对应的字符编码  
}

void Dec_ShowBuf( int i)
{
	if(i<0)
	{
		i = -i;
		LATBbits.LATB7 = 0;
	}
	else
	    LATBbits.LATB7 = 1;
	    
	Led_Show_Buf[3]=i%10;             		//个位
	if(i>9)
	{
		Led_Show_Buf[2]=(i%100)/10;       	//十位
    	if(i>99)  
    	{                        	//
      		Led_Show_Buf[1]=(i%1000)/100;   //百位
      		if(i>999)
      		{
	      		Led_Show_Buf[0]=i/1000;   //
	      	}
	      	else
	      	{
		      	Led_Show_Buf[0]=10;   //
		    }
      	}	
    	else
    	{
      		Led_Show_Buf[1]=10;           //显示空白
      		Led_Show_Buf[0]=10;           //显示空白
      	}	
	}
	else
	{
		Led_Show_Buf[2] = 10;			//显示空白		
		Led_Show_Buf[1] = 10;			//显示空白
		Led_Show_Buf[0] = 10;			//显示空白
	}
    
}
//=============================================================
//名称:send_data
//
//=============================================================
void send_leddata(unsigned char c)
{
	unsigned char j;
	SP_RCLK = 0;								//PORTDbits.RD2 = 0;
	SP_SRCLK = 0;								//PORTDbits.RD3 = 0;	
	for(j=8;j>0;j--)
	{
		if(c & 0x01)
			SP_DAT = 1;							//PORTDbits.RD1 = 1;
		else
			SP_DAT = 0;							//PORTDbits.RD1 = 0;	
		
		c = c >> 1; 

		SP_SRCLK = 1;							//PORTDbits.RD2 = 1;
		Nop();
		SP_SRCLK = 0;							//PORTDbits.RD2 = 0;
	}
		SP_RCLK = 1;							//PORTDbits.RD3 = 1;
		Nop();
		SP_RCLK = 0;							//PORTDbits.RD3 = 0;	
}
void delay(unsigned int i)
{
   while(i)
   {i--;}
}
//==========================================================
//名称:led_refresh
//描述:led刷新子程序,对led各显示位刷新一次
//说明:局部变量i控制对某位的刷新显示
//==========================================================
void led_refresh(void)
{
	delay(1000);
	switch(Nwei_Show)
	{
		case 0:
			PORTE = PORTE | 0x3c;				//先熄灭控制位
			take_data(0);
			send_leddata(Led_Show_Data);
			Led_WX1 = 0;				//	PORTEbits.RE5 = 0;
		break;
		case 1:
			PORTE = PORTE | 0x3c;				//先熄灭控制位
			take_data(1);
			send_leddata(Led_Show_Data);
			Led_WX2 = 0;				//PORTEbits.RE4 = 0;
		break;
		case 2:
			PORTE = PORTE | 0x3c;				//先熄灭控制位
			take_data(2);
			send_leddata(Led_Show_Data);
			Led_WX3 = 0;
		break;
		case 3:
			PORTE = PORTE |0x3c;				//先熄灭控制位
			take_data(3);
			send_leddata(Led_Show_Data);
			Led_WX4 = 0;
		break;
	}
	
	if(Required_Direction == CW)
	{
		LATBbits.LATB6 = 0;	
	}
	else
		LATBbits.LATB6 = 1;

	Nwei_Show ++;
    if(Nwei_Show == 4)
       Nwei_Show=0;
}



int main(void)
{
	InitUserParms();
	SetupPeripherals();			//外设初始化
	Init_LedPort();
	RunMotor();	
	//PDC1 =1600;
	//delay(60000);
	//delay(60000);
	//delay(60000);
	//delay(60000);
	//PDC1 =1800;
	//delay(60000);
	//delay(60000);
	//delay(60000);
	//PDC1 =2500;
	//ReadADC0(&ReadADCParm);
	//CalcVel();
	//PIParmVelocity.qInErr = -2000;
	while(1)
	{	
		//CalcVelIrp();
		//CalcPosPI(&PIParmPosition);
		//CalcPosPI(&PIParmVelocity);
		//CalcVel();
		//InitCalcAng();
		//CalcAng();
		//PDC1 = (((long)PIParmVelocity.qOut * (long)PTPER * 2)>>15);
		k = EncoderParm.qWheelMechAng;
	    k *= 3000;
	    k /= 32768; 
	    a = k;
	    
		a = 32700;
		b = -3270;
		c = a - b; 

	    //CalcTimes();
	    //CalcAngIrp();
	    //POSCNT
	    //PIParmVelocity.qOut
	    //PIParmVelocity .qInRef
	    //PIParmVelocity.qInMeas
	    //adshow
	    //EncoderParm.iIndexCnt
	    //EncoderParm.qWheelMechAng
	    //EncoderParm.qMotorVelMech
	    //PIParmPosition.qInErr
		Dec_ShowBuf(EncoderParm.iSteerCnt);//    PIParmVelocity.qInRef
		led_refresh();
		//pinLED2 = 1;
		//LATBbits.LATB8 = 1;
		//LATBbits.LATB7 = 0;
		//LATBbits.LATB6 = 1;		
	}
}


⌨️ 快捷键说明

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