RobotArm/main.c
2018-04-23 22:51:24 +08:00

282 lines
4.4 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include<stm32f10x.h>
//延时用于指示灯闪烁
void delay(int k)
{
while(k--)
{
int i=1000;
while(i--)
{
int j=100;
while(j--);
}
}
}
//各舵机复位
void ServoInit()
{
TIM3->CCR2=2100;
delay(20);
TIM2->CCR4=1000;
delay(20);
TIM2->CCR3=2300;
delay(20);
TIM2->CCR2=850;
delay(20);
TIM2->CCR1=1400;
delay(50); //各舵机复位
}
//初始化TIM2的四个通道为PWM模式1
void TIM2_Init()
{
RCC->APB1ENR|=3; //TIM2TIM3时钟使能
RCC->APB2ENR|=1<<2; //GPIOA时钟使能
GPIOA->CRL=0xB333BBBB; //GPIOA.0-3,7复用推挽输出GPIOA.4-6通用推挽输出
TIM2->PSC=71;
TIM3->PSC=71; //CNT频率1MHz
TIM2->ARR=20000;
TIM3->ARR=20000; //PWM周期20ms
TIM2->CCMR1|=6<<4; //CH1配置PWM1模式
TIM2->CCMR1|=1<<3; //CH1自动重装载预装载使能
TIM2->CCER|=1; //CH1比较使能
TIM2->CCMR1|=6<<12; //CH2配置PWM1模式
TIM2->CCMR1|=1<<11; //CH2自动重装载预装载使能
TIM2->CCER|=1<<4; //CH2比较使能
TIM2->CCMR2|=6<<4; //CH3配置PWM1模式
TIM2->CCMR2|=1<<3; //CH3自动重装载预装载使能
TIM2->CCER|=1<<8; //CH3比较使能
TIM2->CCMR2|=6<<12; //CH4配置PWM1模式
TIM2->CCMR2|=1<<11; //CH4自动重装载预装载使能
TIM2->CCER|=1<<12; //CH4比较使能
TIM3->CCMR1|=6<<12; //CH2配置PWM1模式
TIM3->CCMR1|=1<<11; //CH2自动重装载预装载使能
TIM3->CCER|=1<<4; //CH2比较使能
TIM2->CR1|=1<<7; //TIM2自动重装载预装载使能
TIM3->CR1|=1<<7; //TIM3自动重装载预装载使能
TIM2->CR1|=1; //TIM2使能
TIM3->CR1|=1; //TIM3使能
// -90 530
// 0 1400
// +90 2400
//大约100对应10度
ServoInit();
}
//颜色识别模块初始化代码
void Color_Init()
{
GPIOA->BSRR=1<<4;
GPIOA->BSRR=1<<5;
GPIOA->BSRR=1<<6;
delay(50);
GPIOA->BRR=1<<4;
GPIOA->BRR=1<<5;
GPIOA->BRR=1<<6;
delay(20);
}
//初始化GPIOC用于工作指示灯
void GPIOC_Init()
{
RCC->APB2ENR|=1<<4; //GPIOC时钟使能
GPIOC->CRH=0;
GPIOC->CRH|=3<<20; //配置PC.13口为通用推挽输出
}
//抓手释放
void release()
{
TIM3->CCR2=1400;
delay(10);
}
//抓手夹持
void hold()
{
TIM3->CCR2=2100;
delay(10);
}
void moveServo1(int i)
{
if(i>2400||i<530) return;
while(TIM2->CCR1>i)
{
TIM2->CCR1-=10;
delay(1);
}
while(TIM2->CCR1<i)
{
TIM2->CCR1+=10;
delay(1);
}
}
void moveServo2(int i)
{
if(i>2400||i<530) return;
while(TIM2->CCR2>i)
{
TIM2->CCR2-=10;
delay(1);
}
while(TIM2->CCR2<i)
{
TIM2->CCR2+=10;
delay(1);
}
}
void moveServo3(int i)
{
if(i>2400||i<530) return;
while(TIM2->CCR3>i)
{
TIM2->CCR3-=10;
delay(1);
}
while(TIM2->CCR3<i)
{
TIM2->CCR3+=10;
delay(1);
}
}
void moveServo4(int i)
{
if(i>2400||i<530) return;
while(TIM2->CCR4>i)
{
TIM2->CCR4-=10;
delay(1);
}
while(TIM2->CCR4<i)
{
TIM2->CCR4+=10;
delay(1);
}
}
void catch30()
{
moveServo4(1200);
moveServo3(2000);
moveServo1(820);
release();
moveServo2(1570);
hold();
moveServo2(850);
moveServo1(2200);
moveServo4(1300);
moveServo3(2300);
moveServo2(1400);
release();
delay(20);
moveServo1(1950);
delay(10);
moveServo2(850);
ServoInit();
}
void catch60()
{
moveServo4(1000);
moveServo3(1600);
moveServo1(1100);
release();
moveServo2(1770);
hold();
moveServo2(850);
moveServo1(2270);
moveServo4(1250);
moveServo3(2100);
moveServo2(1450);
release();
delay(20);
moveServo1(2100);
delay(10);
moveServo2(850);
ServoInit();
}
void catch135()
{
moveServo4(1200);
moveServo3(2000);
moveServo1(1900);
release();
moveServo2(1570);
hold();
moveServo2(850);
moveServo1(2350);
moveServo4(900);
moveServo3(1600);
moveServo2(1700);
release();
delay(20);
moveServo1(2100);
delay(10);
moveServo2(850);
ServoInit();
}
int main()
{
TIM2_Init();
GPIOC_Init();
Color_Init();
catch30();
catch60();
catch135();
while(1)
{
GPIOC->BSRR=1<<13; //开PC.13
delay(5);
GPIOC->BRR=1<<13; //关PC.13
delay(3);
}
/*
while(1)
{
while(TIM2->CCR4<1100)
{
TIM2->CCR4+=20;
TIM2->CCR3+=20;
TIM2->CCR2+=10;
delay(1);
}
delay(3);
while(TIM2->CCR4>530)
{
TIM2->CCR4-=20;
TIM2->CCR3-=20;
TIM2->CCR2-=10;
delay(1);
}
delay(3);
}
*/
}