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

📄 main._c

📁 基于MEAG16的电机PID控制程序
💻 _C
📖 第 1 页 / 共 2 页
字号:
//ICC-AVR application builder : 2009-2-18 11:55:58
// Target : M16
// Crystal: 8.0000Mhz

#include <iom16v.h>
#include <macros.h>
#define  mclk   8000000





//============================================================= 
// 函数名: void port_init(void)
// 功能: 端口初始化,所有端口都变为高阻态
// 参数: none
// 返回值: none
// 使用方法:port_init();
//=============================================================
void port_init(void)
{
    DDRA = 0x00;
	PORTA = 0x00;
	DDRB = 0x00;
	PORTB = 0x00;
	DDRC = 0x00;
	PORTC = 0x00;
	DDRD = 0x00;
	PORTD = 0x00;
}


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


//============================================================= 
// 函数名: void motor_a(unsigned char fx,int speed)
// 功能: 控制电机A的旋转方向以及转速
// 参数: unsigned char fx,int speed  fx为0或者1,speed为0-1023
// 返回值: none
// 使用方法:motor_a(0,1000);
//=============================================================
void motor_a(unsigned char fx,int speed)
{
    if(fx)
	{
	    PORTB |= BIT(2);
		PORTB &= ~BIT(0);
	}  
	else
	{
	    PORTB |= BIT(0);
		PORTB &= ~BIT(2);
	}
	OCR1A = speed;  
}

//============================================================= 
// 函数名: void motor_b(unsigned char fx,int speed)
// 功能: 控制电机A的旋转方向以及转速
// 参数: unsigned char fx,int speed  fx为0或者1,speed为0-1023
// 返回值: none
// 使用方法:motor_b(0,1000);
//=============================================================
void motor_b(unsigned char fx,int speed)
{
    if(fx)
	{
	    PORTB |= BIT(4);
		PORTB &= ~BIT(1);
	}  
	else
	{
	    PORTB |= BIT(1);
		PORTB &= ~BIT(4);
	}
	OCR1B = speed;  
}
//============================================================= 
// 函数名: void motor_init(void)
// 功能: 电机控制初始化
// 参数: none
// 返回值: none
// 使用方法:motor_init();
//=============================================================
void motor_init(void)
{
    DDRB |= 0x17;
	PORTB &= ~0x03;
	PORTB |= 0x14;
	DDRD |= 0x30;
	PORTD |= 0x30;
	TCCR1A = 0xA3;
	TCCR1B = 0x0A;
	OCR1A = 0;
	OCR1B = 0;
}


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


//============================================================= 
// 函数名:void uart_init(unsigned int baud)
// 功能: 异步串行通信初始化
// 参数: unsigned int baud  设置通信波特率
// 返回值: none
// 使用方法:uart_init(19200);
//=============================================================
void uart_init(unsigned int baud)
{
   UCSRB=0x00; 
   UCSRA=0x00; 		    //控制寄存器清零
   UCSRC=(1<<URSEL)|(0<<UPM0)|(3<<UCSZ0);      //选择UCSRC,异步模式,禁止校验,1位停止位,8位数据位
   baud=mclk/16/baud-1	;   //波特率最大为65K
   UBRRL=baud; 					     	  
   UBRRH=baud>>8; 		   //设置波特率
   UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE);   //接收、发送使能,接收中断使能
   DDRD|=0X02;	                //配置TX为输出(很重要)
}
//============================================================= 
// 函数名:void uart_sendB(unsigned char data)
// 功能: 串口发送一个字节
// 参数: unsigned char data  写入要发送的数据
// 返回值: none
// 使用方法:uart_sendB('a');
//=============================================================
void uart_sendB(unsigned char data)
{
   while(!(UCSRA&(BIT(UDRE)))) ;
   UDR=data;
   while(!(UCSRA&(BIT(TXC))));
   UCSRA|=BIT(TXC);
}
//============================================================= 
// 函数名:void uart_send(int data)
// 功能: 串口发送一个4位10进制数
// 参数: int data  写入要发送的数据
// 返回值: none
// 使用方法:uart_sendB(1234);
//=============================================================
void uart_send(int data)
{
    	unsigned char d[4];
	d[3]=data/1000;
	data=data%1000;
	d[2]=data/100;
	data=data%100;
	d[1]=data/10;
	d[0]=data%10;
	uart_sendB(d[3]+'0');
	uart_sendB(d[2]+'0');
	uart_sendB(d[1]+'0');
	uart_sendB(d[0]+'0');
	uart_sendB(';');
}
//============================================================= 
// 函数名:void uart_senddata(unsigned char *data)
// 功能: 通过串口发送字符串
// 参数: unsigned char *data  指针指向要发送的字符串
// 返回值: none
// 使用方法:uart_senddata(abc);
//=============================================================
void uart_senddata(unsigned char *data)
{
	unsigned char *ptr;
	ptr = data;
	while(*ptr)
	{
	    uart_sendB(*ptr);
		ptr++;
	}
}


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


//============================================================= 
// 函数名:void adc_init(void)
// 功能: Adc0 初始化 内部2.56v比较电压
// 参数: none
// 返回值: none
// 使用方法:adc_init();
//=============================================================
void adc_init(void)
{
     DDRA&=~BIT(PA0);
	 PORTA&=~BIT(PA0);
	 ADMUX=0xc0;
	 ADCSRA=0X80;
}
//============================================================= 
// 函数名:unsigned int mega16_ad(void)
// 功能: 读取一次ADC0的值
// 参数: none
// 返回值: addata
// 使用方法:add = mega16_ad();
//=============================================================
unsigned int mega16_ad(void)
{
     unsigned int addata;
	 ADCSRA|=BIT(ADSC);
	 while(!(ADCSRA&(BIT(ADIF))));
     addata=ADCL;
	 addata=addata+ADCH*256;
	 return addata;
}  



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

#define BYTE_BIT0     0x01
#define BYTE_BIT1     0x02
#define BYTE_BIT2     0x04
#define BYTE_BIT3     0x08
#define BYTE_BIT4     0x10
#define BYTE_BIT5     0x20
#define BYTE_BIT6     0x40
#define BYTE_BIT7     0x80
//<nRF2401_Pins 对应引脚>
/*sbit PWR_UP = P1^6;
sbit CE     = P1^2;
//sbit DR2    = P3^5;  //暂时没有用到
//sbit CLK2   = P3^4;
//sbit OUT2   = P3^3;
sbit CS    = P1^1;
sbit DR1   = P1^0;
sbit CLK1  = P3^7;
sbit DATA  = P3^3;
sbit LED0  = P3^4;
sbit LED1  = P3^5;
sbit KEY0  = P3^0;
sbit KEY1  = P3^1;
*/
#define NRF_PORT 	PORTC
#define NRF_DDR		DDRC
#define NRF_PIN		PINC

#define PWR_UP 		PC0
#define CE 			PC1
#define CS			PC4
#define DR1			PC2
#define CLK1		PC3
#define DATA		PC5

#define PWR_UP_STATE		(NRF_PIN&(1<<PWR_UP))==(1<<PWR_UP)
#define CE_STATE			(NRF_PIN&(1<<CE))==(1<<CE)
#define CS_STATE			(NRF_PIN&(1<<CS))==(1<<CS)
#define DR1_STATE			(NRF_PIN&(1<<DR1))==(1<<DR1)
#define CLK1_STATE			(NRF_PIN&(1<<CLK1))==(1<<CLK1)
#define DATA_STATE			(NRF_PIN&(1<<DATA))==(1<<DATA)

#define PWR_UP_SET()		{NRF_PORT|=1<<PWR_UP;}
#define PWR_UP_CLR()		{NRF_PORT&=~(1<<PWR_UP);}
#define CE_SET()			{NRF_PORT|=1<<CE;}
#define CE_CLR()			{NRF_PORT&=~(1<<CE);}
#define CS_SET()			{NRF_PORT|=1<<CS;}
#define CS_CLR()			{NRF_PORT&=~(1<<CS);}
#define DR1_SET()			{NRF_PORT|=1<<DR1;}
#define DR1_CLR()			{NRF_PORT&=~(1<<DR1);}
#define CLK1_SET()			{NRF_PORT|=1<<CLK1;}
#define CLK1_CLR()			{NRF_PORT&=~(1<<CLK1);}
#define DATA_SET()			{NRF_PORT|=1<<DATA;}
#define DATA_CLR()			{NRF_PORT&=~(1<<DATA);}
/*
#define LED0_SET()			{PORTC|=1<<PC0;DDRC|=1<<PC0;}
#define LED0_CLR()			{PORTC&=~(1<<PC0);}
#define LED1_SET()			{PORTC|=1<<PC1;DDRC|=1<<PC1;}
#define LED1_CLR()			{PORTC&=~(1<<PC1);}

#define KEY0			(PINB&(1<<PB0))
#define KEY1			(PINB&(1<<PB1))
#define KEY_INIT()		{PORTB|=((1<<PB0)|(1<<PB1));DDRB&=~((1<<PB0)|(1<<PB1));}

/*
*************************************************************
*     nRF2401 Configuration                                 *
*    保存2401 的配置信息                                    *
*************************************************************
*/
/*=====<RF-Configuration-Register   配置信息>=====*/
//芯片测试用,无需修改
#define TEST_2         0x8E               //MSB     D143~D136 
#define TEST_1         0x08               //        D135~D128 
#define TEST_0         0x1C               //       D127~D120 
/* 注意: DATAx_W + ADDRx_W + CRC 的值必须小于256 !
单个数据包的大小必须小于32 字节(256 位) */
#define DATA2_W        0x10      //0x10=2 字节        //频道2   发送/接收数据长度(单位:Bit) 
#define DATA1_W        0xE0      //0x20=28 字节       //频道1   发送/接收数据长度(单位:Bit) 
/* 注意:2401 忽略ADDR 中超过ADDR_W 设定宽度的那些位,同时地址不能全部设置为0 */
//频道2    接收地址          < - 频道2 未启用
#define ADDR2_4        0x00
#define ADDR2_3        0x1c
#define ADDR2_2        0xcc
#define ADDR2_1        0xcc
#define ADDR2_0        0xcc
//频道 1  接收地址 (当前模块地址)                 <- 只使用到频道 1
#define ADDR1_4        0x00
#define ADDR1_3        0xcc
#define ADDR1_2        0xcc
#define ADDR1_1        0xcc
#define ADDR1_0        0xcc
#define ADDR_W       0x10   //0x10=2 字节      //发送/接收地址宽度(单位:Bit) 
#define CRC_L        0x1                       //CRC 模式  0:8 位 1:16 位 
#define CRC_EN       0x1                       //CRC 校验  0:禁用         1:启用 
#define RX2_EN       0x0                       //双频道功能  0:禁用          1:启用 
#define CM           0x1                       //0:Direct mode   1:ShockBurst mode 
#define RFDR_SB      0x0    //传输速率0:250kbps/1:1Mbps(250kbps比1Mbps传输距离更远)
#define XO_F         0x3    //16M              //nRF2401  晶振频率(具体设置见下图) 
#define RF_PWR       0x3                       //信号发射功率(具体设置见下图) 
#define RF_CH        0x2                       //Channel RF 频率设置 
//Channel = 2400MHz + RF_CH * 1.0MHz
#define RXEN_NRF         0x0                       //0:Tx    1:Rx 
//程序会通过 SetTxMode/SetRxMode 重新设置此项参数
//<将设置信息组合成每个字节的数据信息,此区域无需修改>
#define RFConfig_Bit0  TEST_2
#define RFConfig_Bit1  TEST_1
#define RFConfig_Bit2  TEST_0
#define RFConfig_Bit3  DATA2_W
#define RFConfig_Bit4  DATA1_W
#define RFConfig_Bit5  ADDR2_4
#define RFConfig_Bit6  ADDR2_3
#define RFConfig_Bit7  ADDR2_2
#define RFConfig_Bit8  ADDR2_1
#define RFConfig_Bit9  ADDR2_0
#define RFConfig_Bit10 ADDR1_4
#define RFConfig_Bit11 ADDR1_3
#define RFConfig_Bit12 ADDR1_2
#define RFConfig_Bit13 ADDR1_1
#define RFConfig_Bit14 ADDR1_0
#define RFConfig_Bit15 (ADDR_W<<2 | CRC_L<<1 | CRC_EN)
#define RFConfig_Bit16 (RX2_EN<<7 | CM<<6 | RFDR_SB<<5 | XO_F <<2 | RF_PWR)
#define RFConfig_Bit17 (RF_CH<<1 | RXEN_NRF)

//------------------------------------------------------
//通过宏定义将 18 字节的寄存器参数按照各个功能分解,以便于参数的调整
unsigned char /*code*/ nRF2401_Conf[18] =
{
	RFConfig_Bit0, RFConfig_Bit1, RFConfig_Bit2, RFConfig_Bit3,	RFConfig_Bit4,
	RFConfig_Bit5, RFConfig_Bit6, RFConfig_Bit7, RFConfig_Bit8, RFConfig_Bit9,
	RFConfig_Bit10, RFConfig_Bit11, RFConfig_Bit12, RFConfig_Bit13, 

⌨️ 快捷键说明

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