工程机器人比赛二(2020-09-16)

工程机器人比赛一(2020-09-16)

灰度模块

10个灰度


//前灰度
		pc12      pc13-pb9-pb8-pb5      pc14 
		DUc12  DUc13-DUb9-DUb8-DUb5      DUc14
				黑色为1    白色为0
//后灰度
		DUa11      DUa12       DUc10    DUc11
#define DUc12  	  GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_12)//读取电频
#define DUc13		GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13)//读取电频
#define DUb9 	GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)//读取电频
#define DUb8  	GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)//读取电频
#define DUb5  	GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)//读取电频
#define DUc14  	GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_14)//读取电频


#define DUa11 	GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)//读取电频
#define DUa12  	GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_12)//读取电频
#define DUc10  	GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_10)//读取电频
#define DUc11  	GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_11)//读取电频

拓展版原理图:
在这里插入图片描述

四舵机

舵机初始化:

void  duoji_init(unsigned short arr,unsigned short psc)
{
	TIM_TimeBaseInitTypeDef   TIM_TimeBasestruct;
	GPIO_InitTypeDef	GPIO_InitStructure;
	TIM_OCInitTypeDef  TIM_OCInitTystructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO,ENABLE );
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

	

	
	GPIO_Init(GPIOC,&GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	
	
	GPIO_Init(GPIOD,&GPIO_InitStructure);
	
	GPIO_PinRemapConfig(GPIO_Remap_TIM4,ENABLE);
//GPIO_PinRemapConfig(,ENABLE);      TIM8重映射
	TIM_TimeBasestruct.TIM_ClockDivision=0;
	TIM_TimeBasestruct.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBasestruct.TIM_Period=arr;
	TIM_TimeBasestruct.TIM_Prescaler=psc;

	TIM_TimeBaseInit(TIM4,&TIM_TimeBasestruct);
//	TIM_TimeBaseInit(TIM8,&TIM_TimeBasestruct);
//	TIM_CtrlPWMOutputs(TIM8,ENABLE);//主输出使能
	
	
	TIM_OCInitTystructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
	TIM_OCInitTystructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM_OCInitTystructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
	TIM_OCInitTystructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性gao

  TIM_OC1Init(TIM4, &TIM_OCInitTystructure);
	TIM_OC2Init(TIM4, &TIM_OCInitTystructure);
	TIM_OC3Init(TIM4, &TIM_OCInitTystructure);
	TIM_OC4Init(TIM4, &TIM_OCInitTystructure);
 
 


		
		TIM_ARRPreloadConfig(TIM4, ENABLE); //使能TIMx在ARR上的预装载寄存器
	 	TIM_Cmd(TIM4, ENABLE);  //使能TIM1 
		

		
}

桶升起:


void Tong_Up3(u32 k)
{
	u8 i;
	if(Tong_Up_aim3 > TONG_SHENGJIANG_TIMX)
	{ 
		for(i = TONG_SHENGJIANG_TIMX; i < Tong_Up_aim3; i++)
		{
			TONG_SHENGJIANG_TIMX = i;
			delay_ms(k);
		}
	}
	else 
	{
		for(i = TONG_SHENGJIANG_TIMX; i > Tong_Up_aim3; i--)
		{
			TONG_SHENGJIANG_TIMX = i;
			delay_ms(k);
		}
	
	}
   	tell_color(); //颜色识别
}

其他控制舵机操作见源码

电机控制(开环控制)

//定时器初始化
void TIM1_PWM_Init(unsigned short arr,unsigned short psc)
{
		
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	GPIO_InitTypeDef GPIO_InitStructure; 

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
//	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2|RCC_APB1Periph_TIM3|RCC_APB1Periph_TIM4, ENABLE);// 
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1|RCC_APB2Periph_AFIO , ENABLE);  
	//AFIO->MAPR|=3<<6;
	GPIO_PinRemapConfig(GPIO_FullRemap_TIM1,ENABLE);  //   ①
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_11|GPIO_Pin_13|GPIO_Pin_14;         
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 	
	GPIO_Init(GPIOE, &GPIO_InitStructure);  
	
//	TIM1->BDTR|=1<<16;
		TIM_CtrlPWMOutputs(TIM1,ENABLE);//MOE主输出      ②
	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	 80K
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

	
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性di
	
	TIM_OC1Init(TIM1,&TIM_OCInitStructure);//初始化CH1
	TIM_OC2Init(TIM1,&TIM_OCInitStructure);//初始化CH2
	TIM_OC3Init(TIM1,&TIM_OCInitStructure);//初始化CH3
	TIM_OC4Init(TIM1,&TIM_OCInitStructure);//初始化CH4
	
	TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);//CH1 预装载使能
	TIM_OC2PreloadConfig(TIM1,TIM_OCPreload_Enable);//CH2 预装载使能
	TIM_OC3PreloadConfig(TIM1,TIM_OCPreload_Enable);//CH3 预装载使能
	TIM_OC4PreloadConfig(TIM1,TIM_OCPreload_Enable);//CH4 预装载使能
	
	TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器
		    TIM_SetCompare3(TIM1,0);
		TIM_SetCompare4(TIM1,0);
    TIM_SetCompare1(TIM1,0);
		TIM_SetCompare2(TIM1,0);
	
	//TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器
 	TIM_Cmd(TIM1, ENABLE);  //使能TIM1  

	
}

小车移动函数:

	 
void LEFTgo(float speed)//0-100速度
{
	if (speed>=100) speed = 100;
	speed=speed*48.0;
	
    TIM_SetCompare2(TIM1,speed);
		TIM_SetCompare1(TIM1,0);
}
void LEFTback(float speed)
{
		if (speed>=100) speed = 100;
	speed=speed*48.0;
    TIM_SetCompare1(TIM1,speed);
		TIM_SetCompare2(TIM1,0);
}
void CARgo(float left_speed,float right_speed)
	
{
 RIGHTgo( right_speed);
 LEFTgo( left_speed);


}

其余动作见源码

原理图:
在这里插入图片描述
电机驱动控制

核心板接线:
在这里插入图片描述

颜色识别模块;gy33

该模块能用串口直接传输颜色参数。
稳定性还可以
串口初始化


void Usart1_init(u32 bound)
{

	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1,GPIOA时钟
  // RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
	
	//USART1_TX   GPIOA.9
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; 
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.2
   
  //USART1_RX	  GPIOA.10初始化
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.3 

  //Usart1 NVIC 配置
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
  
   //USART 初始化设置

	USART_InitStructure.USART_BaudRate = bound;//串口波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
	USART_InitStructure.USART_StopBits = USART_StopBit![在这里插入图片描述](https://img-blog.csdnimg.cn/20201018123351942.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3l1bmRkdW4=,size_16,color_FFFFFF,t_70#pic_center)
s_1;//一个停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式

  USART_Init(USART1, &USART_InitStructure); //初始化串口2
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
  USART_Cmd(USART1, ENABLE);                    //使能串口2
	
	
	USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);


}

中断处理模块接收回来的数据
具体gy33数据格式链接:

void USART1_IRQHandler(void)                	//串口1中断服务程序
	{
	
	u8   j=0,sum=0,k;
//		u8  Res;
	static  uint8_t  i=0; 
		
	// 5A 5A 45 03 51 4C 48 E1
	//头   头   45模式    3个数据    校准位
	

	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收数据就绪可读
	{
				 USART_ClearITPendingBit(USART1,USART_IT_RXNE);
           

						USART1_RX_BUFL[i]=USART_ReceiveData(USART1);	//读取接收到的数据
				i++;
				if(i==8)
				{
					i=0;
		for(j=0;j<7;j++)
					sum+=USART1_RX_BUFL[j];
					if(sum==USART1_RX_BUFL[7]&&USART1_RX_BUFL[2]==0x45)
						{
							/*	rgb.Red=0;
								rgb.Green=0;
								rgb.Blue=0;*/
				rgb.Red=USART1_RX_BUFL[4];
				rgb.Green=USART1_RX_BUFL[5];
        rgb.Blue=USART1_RX_BUFL[6];
			/*	OLED_ShowNum(103,6,rgb.Blue,3,16);
					OLED_ShowNum(50,6,rgb.Green,3,16);
					OLED_ShowNum(20,6,rgb.Red,3,16);
				 	OLED_ShowNum(40,2,color,3,16);*/

			tell_color();
for(k=0;k<8;k++)
							USART1_RX_BUFL[k]=0;
							


		}
	}
	}
	}

在这里插入图片描述

在这里插入图片描述
工程机器人比赛三(错误总结)(2020-09-16)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值