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

📄 main._c

📁 基于MEAG16的电机PID控制程序
💻 _C
📖 第 1 页 / 共 2 页
字号:
	RFConfig_Bit14,	RFConfig_Bit15, RFConfig_Bit16, RFConfig_Bit17
};
//------------------------------------------------------------

/*
*************************************************************
*     nRF2401 Tx/Rx functions                                             
*
*
*     void Delay100(void);
*     void Config2401(void);      //配置2401,写入初始化设置
*     void SetTxMode(void);       //设置为发送模式
*     void SetRxMode(void);       //设置为接收模式
*     void nRF2401_TxPacket(unsigned char TxBuf[]);
*                                 //发送TxBuf[] 内的数据 长度由 DATA1_W 决定
*     unsigned char nRF2401_RxPacket(unsigned char *RxBuf);
*                                 //检查是否有数据需要接受 如果有,则保存至RxBuf[]
*                                 //返回值  0:没有接收到数据 1:接收到数据
*************************************************************
*/
//16M  晶振  600us 左右
/*void Delay100(void)
{
	unsigned int i;
	for (i=0;i<100;i++);
}*/

/*==================================================
nRF2401 设置配置寄存器时序
=====================================================*/
//bdata 
unsigned char DATA_BUF;       //用于ByteRead和ByteWrite函数
#define DATA7    ((DATA_BUF&BYTE_BIT7) != 0)
#define DATA0    ((DATA_BUF&BYTE_BIT0) != 0)


void delay_1us(void)                 //1us延时函数 
  { 
   asm("nop"); 
  } 

void delay_nus(unsigned int n)       //N us延时函数 
  { 
   unsigned int i=0; 
   for (i=0;i<n;i++) 
   delay_1us(); 
  } 
   
void delay_1ms(void)                 //1ms延时函数 
  { 
   unsigned int i; 
   for (i=0;i<1140;i++); 
  } 
   
void delay_nms(unsigned int n)       //N ms延时函数 
  { 
   unsigned int i=0; 
   for (i=0;i<n;i++) 
   delay_1ms(); 
  } 



unsigned char ByteRead(void)
{
	unsigned char i;
	for (i=0;i<8;i++)
	{
		DATA_BUF=DATA_BUF<<1;
		//CLK1=1;
		CLK1_SET();
		//DATA=1;        //设置为输入状态
		NRF_DDR&=~(1<<DATA);
		DATA_SET();
		//if (DATA)      //读取最高位,保存至最末尾,通过左移位完成整个字节
		if(DATA_STATE)
		{
			DATA_BUF|=BYTE_BIT0;
		}
		else
		{
			DATA_BUF&=~BYTE_BIT0;
		}
		//CLK1=0;
		CLK1_CLR();
	}
	return DATA_BUF;
}

void ByteWrite(unsigned char send)
{
	unsigned char i;
	DATA_BUF=send;
	NRF_DDR|=((1<<DATA)|(1<<CLK1));
	for (i=0;i<8;i++)
	{
		if (DATA7)     //总是发送最高位
		{
			//DATA=1;
			DATA_SET();
		}
		else
		{
			//DATA=0;
			DATA_CLR();
		}
		//CLK1=1;
		CLK1_SET();
		DATA_BUF=DATA_BUF<<1;
		//CLK1=0;
		CLK1_CLR();
	}
}

/*    <2401 配置寄存器的写入方式>
NOTE.
On the falling edge of CS, the nRF2401A updates the number of bits actually shifted
in during the last configuration.
Ex:
If the nRF2401A is to be configured for 2 channel RX in ShockBurst., a total of 120
bits must be shifted in during the first configuration after VDD is applied.
Once the wanted protocol, modus and RF channel are set, only one bit (RXEN) is
shifted in to switch between RX and TX.
注意  :2401 配置寄存器的数据写入通过一移位寄存器完成
*/
void Config2401(void)
{
	unsigned int i;
	unsigned char variablel;
	//CS=0;
	//CE=0;
	//PWR_UP=1; //上电
	NRF_DDR|=((1<<CS)|(1<<CE)|(1<<PWR_UP));
	CS_CLR();
	CE_CLR();
	PWR_UP_CLR();
	//for (i=0;i<10;i++) Delay100();//从上电到进入配置模式需要3ms 的延时
	delay_nms(6);
	//CS=1;     //使RF2401 进入配置方式
	CS_SET();
	for (i=0;i<18;i++)
	{
		variablel=nRF2401_Conf[i];
		ByteWrite(variablel);
	}
	//Delay100();
	delay_nus(600);
	//CS=0;    //CS 置低使配置有效
	CS_CLR();
	//Delay100();
	delay_nus(600);
}

void SetTxMode(void)
{
	NRF_DDR|=((1<<CS)|(1<<CE)|(1<<PWR_UP)|(1<<DATA)|(1<<CLK1));
	//设置为配置模式
	//PWR_UP=1;
	//CE=0;
	//CS=1;
	PWR_UP_SET();
	CE_CLR();
	CS_SET();
	//Delay100();
	delay_nus(600);
	//配置寄存器0 字节RXEN  设置为0:发送模式
	//DATA =0;
	//CLK1=1;
	//CLK1=0;
	DATA_CLR();
	CLK1_SET();
	CLK1_CLR();
	//设置为Activemodes(Tx)
	//CS=0;
	//CE=1;
	CS_CLR();
	CE_SET();
	//Delay100();
	delay_nus(600);
}

void SetRxMode(void)
{
	NRF_DDR|=((1<<CS)|(1<<CE)|(1<<PWR_UP)|(1<<DATA)|(1<<CLK1));
	//设置为配置模式
	//PWR_UP = 1;
	//CE=0;
	//CS=1;
	PWR_UP_SET();
	CE_CLR();
	CS_SET();
	//Delay100();
	delay_nus(600);
	//配置寄存器0 字节RXEN  设置为 1:接收模式
	//DATA =1;
	//CLK1=1;
	//CLK1=0;
	DATA_SET();
	CLK1_SET();
	CLK1_CLR();
	//设置为Activemodes(Rx)
	//CS=0;
	//CE=1;
	CS_CLR();
	CE_SET()
	//Delay100();
	delay_nus(600);
	NRF_DDR&=~(1<<DATA);
}

//接收方通道硬件地址
unsigned char TxAddress[]={0xcc,0xcc,0xcc,0xcc};
//nRF2401 数据发送函数
void nRF2401_TxPacket(unsigned char TxBuf[])
{
	int i;
	unsigned char variable2;
	//CE=1;
	CE_SET();
	//Delay100();
	delay_nus(600);
	for (i=0;i< (ADDR_W/8);i++)//写入接收地址(按字节对齐)
	{
		variable2=TxAddress[i];
		ByteWrite(variable2);
	}
	for (i=0;i<(DATA1_W/8);i++)//写入需要发送的数据(按字节对齐)
	{
		variable2=TxBuf[i];
		ByteWrite(variable2);
	}
	//CE=0; //CE 置低使发送有效
	CE_CLR();
	//Delay100(); //时钟信号高电平保持
	//Delay100();
	delay_nus(1200);
}

/*----------------------------------------------------------------*/
//检测并接收数据函数
//返回  0:没有数据接收
//      1:接收到数据
unsigned char nRF2401_RxPacket(unsigned char *RxBuf)
{
	unsigned int i;
	//DR1=1;
	NRF_DDR&=~(1<<DR1);
	DR1_SET();
	//if (DR1)
	if(DR1_STATE)
	{
		for (i=0; i<DATA1_W/8; i++)
		{
			*RxBuf      = ByteRead();
				RxBuf++;
			}
		return 1;
	}
	return 0;
}



///////////////////////////////////////////////////////////////////////////////////////////////////

unsigned char TxRxBuf[32];


void main (void)
{
	unsigned int ada,i,add,sj0,sj1,sj2,sj3,speeda,speedb;
	unsigned char uartok[] = "Uart OK ";
	unsigned char speedi[] = "Now speed is ";
	unsigned char adcs[] = "Now adc is ";
	port_init();
	motor_init();
	uart_init(19200);
	adc_init();
	uart_senddata(uartok);
	Config2401(); 
	delay_nus(600);
	SetRxMode(); //  设置RF2401 为接收模式
	                         
	while(1)
	{
	    delay_nms(1);
		if (nRF2401_RxPacket(TxRxBuf)==1)         //返回 1  表明有数据包接收到
		{
			
			sj0 = TxRxBuf[0];
			sj0 <<= 8;
			sj0 |= TxRxBuf[1];
			sj1 = TxRxBuf[2];
			sj1 <<= 8;
			sj1 |= TxRxBuf[3];
			sj2 = TxRxBuf[4];
			sj2 <<= 8;
			sj2 |= TxRxBuf[5];
			sj3 = TxRxBuf[6];
			sj3 <<= 8;
			sj3 |= TxRxBuf[7];
			uart_send(sj2);
			uart_send(sj2);
			uart_send(sj2);
			uart_send(sj2);
			if(sj0>sj1)
			{
		        speeda = sj0-sj1;
				if(speeda<50)
				    motor_a(1,0);
				else
				    motor_a(1,5*(speeda-50));
			}
		    else
			{
				speeda = sj1-sj0;
				if(speeda<50)
				    motor_a(0,0);
				else
					motor_a(0,5*(speeda-50));
			}
		    if(sj2>sj3)
			{
		        speedb = sj2-sj3;
				if(speedb<50)
				    motor_b(1,0);
				else
				    motor_b(1,5*(speedb-50));
			}
		    else
			{
				speedb = sj1-sj0;
				if(speedb<50)
				    motor_b(0,0);
				else
					motor_b(0,5*(speedb-50));
			}
			
		}

	}
}

⌨️ 快捷键说明

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