版权声明: https://blog.csdn.net/qq_38351824/article/details/82954936
机器人武术擂台---无差别组(三)电路接线
做一份笔记,大佬勿喷。
作者:sumjess
注意:本博客是以《2018年华北五省(市、自治区)大学生机器人大赛竞赛规则》为基础而写的
一、模块介绍:
1、光电开关(16个):
(1)图片:
(2)原理:
(3)产品信息:
(4)注意事项:
(5)测试函数片段:
光电开关初始化:
#define gdqianchanzuo GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_0)
#define gdqianchanyou GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_1)
#define gdhouchanzuo GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_2)
#define gdhouchanyou GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_10)
#define gdqian1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_11)
#define gdqian2 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_12)
#define gdzuo1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_13)
#define gdzuo2 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_14)
#define gdhou1 GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_2)
#define gdhou2 GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_3)
#define gdyou1 GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_4)
#define gdyou2 GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_5)
#define gdzuoqian GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_6)
#define gdyouqian GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_7)
#define gdzuohou GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_11)
#define gdyouhou GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_12)
//光电开关初始化
void guangdian_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //使能A端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化GPIO D0-7
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE); //使能A端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
GPIO_Init(GPIOG, &GPIO_InitStructure); //初始化GPIO G2-7
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能A端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_11|GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化GPIO C11、12
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); //使能A端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_11|GPIO_Pin_10|GPIO_Pin_13|GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
GPIO_Init(GPIOE, &GPIO_InitStructure); //初始化GPIO E10-14
}
测试主函数:
void GDceshi(void)
{
int a;
//铲子
a=gdqianchanzuo;
OLED_ShowNum(0,0,a,3,12);
a=gdqianchanyou;
OLED_ShowNum(18,0,a,3,12);
a=gdhouchanzuo;
OLED_ShowNum(36,0,a,3,12);
a=gdhouchanyou;
OLED_ShowNum(54,0,a,3,12);
//前
a=gdzuoqian;
OLED_ShowNum(0,2,a,3,12);
a=gdqian1;
OLED_ShowNum(18,2,a,3,12);
a=gdqian2;
OLED_ShowNum(36,2,a,3,12);
a=gdyouqian;
OLED_ShowNum(54,2,a,3,12);
//中
a=gdzuo1;
OLED_ShowNum(0,4,a,3,12);
a=gdzuo2;
OLED_ShowNum(18,4,a,3,12);
a=gdyou1;
OLED_ShowNum(36,4,a,3,12);
a=gdyou2;
OLED_ShowNum(54,4,a,3,12);
//后
a=gdzuohou;
OLED_ShowNum(0,6,a,3,12);
a=gdhou1;
OLED_ShowNum(18,6,a,3,12);
a=gdhou2;
OLED_ShowNum(36,6,a,3,12);
a=gdyouhou;
OLED_ShowNum(54,6,a,3,12);
delay_ms(800);//刷新时间
OLED_Clear();//清屏
}
2、电机驱动及电机:
电机和电机驱动我们均使用的是得科技术(淘宝店铺)
(1)图片:
(2)产品信息:
- 385电机,减速箱和电机尺寸和老款保持一致,完美替代。
- 扭矩将达到65kg.cm,将是老款纳英特24V2200电机的五倍性能。
- 采用双滚珠轴承电机,更加顺滑,寿命更加长,更加稳定。老款纳英特24V2200电机采用普通轴承。
- 齿轮都加厚、加强处理,完全杜绝断齿,滑齿缺陷。
- 减速比保持不变:依然是1:20。
- 六角输出轴采用轴承,老款是普通铜套,避免输出轴重负载下卡死。
- 初级齿轮采样斜齿,更加静音,同时避免上50000转高速时候卡齿。
- 堵转电流76A左右
(3)注意事项:
☆☆☆☆☆使用直流电机驱动正转过程中,应该先0(0%PWM)速100ms以上,等物流二极管续流后,再反转。这样可以避免瞬间反转导致的高压高流,击穿mos管。。。。(可不加)
☆☆☆☆☆PWM频率必须高于1K以上,4K-20K都可以。(一定保证)
☆☆☆☆☆因为驱动半桥需要自举生压,PWM占空比必须小于98%。最好在95%以下。(一定保证)
1、电机电源接通,中间一定要通过开关来上电,不能直接电池插入,容易产生火花产生高压,击穿板子。5V和GND各引出2路,方便2块板子组成四驱时接线。普通接一个就行。
2、上电顺序:可以驱动电源和右边8P接口的5V一起上电。如果测试,而且不同时上电,那么先上电+5V和GND,再上电电机电源。
3、5V和GND是控制器板子给驱动板供电,一定要接入。不要只接了IN1-4,没有接5V和GND。IN1和IN2控制左边的驱动,IN3和IN4控制右边的驱动。当IN1给PWM,IN2给0,即正转,当IN1给0,IN2给PWM,即反转。二边都给0,或者给反方向速度就刹车。
4、驱动普通功率电机,一个电机驱动端子可以并联接2个电机,这样一块驱动板可以驱动4个电机。如果接大功率擂台电机,那么尽量用2块驱动板,驱动4个电机,组成四驱。
5、驱动板的电源GND 和5V接口的GND 为同一个地。接线时候务必小心确认这2个GND为同一个GND。以免发生GND短路。
(4)测试函数片段:
void speed_Configuration(void)
{
//**********电机驱动设置************//
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure ;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟
TIM_DeInit(TIM3);//初始化TIM1寄存器
GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE); //Timer1完全重映射 TIM1_CH1->PE9 CH2->PE11 CH1->PE13 CH1->PE14
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9; //TIM1_CH1 //设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形 GPIOE.9
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIO
//**************************************************************************
// 定时器1设置: 72分频,频率10KHz,向上计数,105是为了速度为100时,PWM占空比不会到100,方便电机驱动自举生压。一般PWM频率大于1K,4-10K比较好。
//**************************************************************************
TIM_TimeBaseStructure.TIM_Period = 105-1;
TIM_TimeBaseStructure.TIM_Prescaler = 71;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
// 主定时器T4为 PWM1 模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);//使能的预装载寄存器
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);//使能的预装载寄存器
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC3Init(TIM3, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);//使能的预装载寄存器
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC4Init(TIM3, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);//使能的预装载寄存器
TIM_ARRPreloadConfig(TIM3, ENABLE); //使能定时器1
TIM_Cmd(TIM3, ENABLE);
}
//2个PWM口控制一路电机。IN1给PWM,IN2给0,正转;IN1给0,IN2给PWM,反转。
void Motor(u8 port, s8 speed)
{
if(speed >= 0)
{
if(speed>100) speed=100;
switch(port)
{
case 1:
TIM3->CCR1 = speed;
TIM3->CCR2 = 0;
break;
case 2:
TIM3->CCR3 = speed;
TIM3->CCR4 = 0;
break;
}
}
else
{
if(speed<-100) speed=-100;
switch(port)
{
case 1:
TIM3->CCR1 = 0;
TIM3->CCR2 = -speed;
break;
case 2:
TIM3->CCR3 = 0;
TIM3->CCR4 = -speed;
break;
}
}
}