機器人國術擂台---無差别組(三)電路接線
做一份筆記,大佬勿噴。
作者:sumjess
注意:本部落格是以《2018年華北五省(市、自治區)大學生機器人大賽競賽規則》為基礎而寫的
一、子產品介紹:
1、光電開關(16個):
(1)圖檔:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SN5YDN0U2M5YDO3kDM0gDMzYzX3ADM0ETM2IzLchDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
(2)原理:
(3)産品資訊:
(4)注意事項:
(5)測試函數片段:
光電開關初始化:
#define up_for_lift GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)
#define up_for_right GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2)
#define up_back_left GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4)
#define up_back_right GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)
#define for_1 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6)
#define for_2 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)
#define for_3 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)
#define back_1 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)
#define back_2 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)
#define left_1 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)
#define left_2 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)
#define right_1 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)
#define right_2 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)
#define for_lift GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0)
#define for_right GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_1)
#define back_lift GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2)
#define back_right GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3)
#define down_1 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_4)
#define down_2 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)
#define down_3 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_6)
//光電開關初始化
void optoelect_switch()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE); //使能A端口時鐘
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空輸入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;
GPIO_Init(GPIOC, &GPIO_InitStructure); //浮空輸入 ,IO口速度為50MHz
}
測試主函數:
void GD_oled(void)
{
int a;
//鏟子
a=up_for_lift;
OLED_ShowNum( 0,0,a,1,12);
a=up_for_right;
OLED_ShowNum(18,0,a,1,12);
up_back_left;
OLED_ShowNum(36,0,a,1,12);
a=up_back_right;
OLED_ShowNum(54,0,a,1,12);
//前
a=for_1 ;
OLED_ShowNum( 0,2,a,1,12);
a=for_3;
OLED_ShowNum(18,2,a,1,12);
a=for_lift ;
OLED_ShowNum(36,2,a,1,12);
a=for_right;
OLED_ShowNum(54,2,a,1,12);
//中
a=left_1;
OLED_ShowNum( 0,4,a,1,12);
a=left_2;
OLED_ShowNum(18,4,a,1,12);
a=right_1;
OLED_ShowNum(36,4,a,1,12);
a=right_2;
OLED_ShowNum(54,4,a,1,12);
//後
a=back_1;
OLED_ShowNum( 0,6,a,1,12);
a= back_2 ;
OLED_ShowNum(18,6,a,1,12);
a=back_lift;
OLED_ShowNum(36,6,a,1,12);
a= back_right;
OLED_ShowNum(54,6,a,1,12);
delay_ms(800);//重新整理時間
OLED_Clear();//清屏
}
(6)擺放位置:
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塊闆子組成四驅時接線。普通接一個就行。注意:如果單片機供電為3.3v,那麼使能端也将為3.3v
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個電機,組成四驅。
(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;
}
}
}