灰度模块
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;
}
}
}
}