stm32三自由度机器人c语言程序代码.docx

上传人:b****6 文档编号:4128074 上传时间:2022-11-28 格式:DOCX 页数:56 大小:28.45KB
下载 相关 举报
stm32三自由度机器人c语言程序代码.docx_第1页
第1页 / 共56页
stm32三自由度机器人c语言程序代码.docx_第2页
第2页 / 共56页
stm32三自由度机器人c语言程序代码.docx_第3页
第3页 / 共56页
stm32三自由度机器人c语言程序代码.docx_第4页
第4页 / 共56页
stm32三自由度机器人c语言程序代码.docx_第5页
第5页 / 共56页
点击查看更多>>
下载资源
资源描述

stm32三自由度机器人c语言程序代码.docx

《stm32三自由度机器人c语言程序代码.docx》由会员分享,可在线阅读,更多相关《stm32三自由度机器人c语言程序代码.docx(56页珍藏版)》请在冰豆网上搜索。

stm32三自由度机器人c语言程序代码.docx

stm32三自由度机器人c语言程序代码

stm32三自由度机器人c语言程序代码

 

main.c

/**

******************************************************************************

*@fileGPIO/IOToggle/main.c

*@authorMCDApplicationTeam

*@versionV3.5.0

*@date08-April-2011

*@briefMainprogrambody.

******************************************************************************

*@attention

*

******************************************************************************

*/

/*Includes------------------------------------------------------------------*/

#include"stm32f10x.h"

#include

#include"main.h"

#include"delay.h"

#include"DMA.h"

#include"TIMx.h"

#include"GPIOx.h"

#include"NVIC.h"

#include"USARTx.h"

 

/*宏定义------------------------------------------------------------------*/

#defineucharunsignedchar

#defineuintunsignedint

#defineMotor1_SUB16//电机116细分

#defineMotor2_SUB16//电机216细分

#defineMotor3_SUB16//电机316细分

 

#defineMotor1_DIRPAout(4)//电机1方向

#defineMotor2_DIRPAout(5)//电机2方向

#defineMotor3_DIRPAout(7)//电机3方向

 

#defineMotor1_UPMotor1_DIR=1//电机1上升

#defineMotor2_UPMotor2_DIR=1//电机2上升

#defineMotor3_UPMotor3_DIR=1//电机3上升

 

#defineMotor1_DOWNMotor1_DIR=0//电机1下降

#defineMotor2_DOWNMotor2_DIR=0//电机2下降

#defineMotor3_DOWNMotor3_DIR=0//电机3下降

/*变量定义------------------------------------------------------------------*/

u8Delay_1s_Finishflag=0;

u8KeyTrg=0;//按键触发

u8KeyCont=0;//按键长按

 

uinti;

u16EXIT0_CNT=0;

u8Motor1_OriginFlag=0;//电机1原点标识

u8Motor2_OriginFlag=0;//电机1原点标识

u8Motor3_OriginFlag=0;//电机1原点标识

 

u8Motor_Arrived=0;//电机到达标识

/*函数声明------------------------------------------------------------------*/

voidRTC_configuration(void);

voidRCC_Configuration(void);

voidKeyRead(void);

voidDelay_Ms(u16time);

voiddelay_1s(uinttime);

 

//==================================MAIN=======================================

intmain(void)

{

u16i=0;

BUZZER=0;//蜂鸣器复位

 

GPIOE->ODR&=0xffff0000;//LED1~LED8=0;

RCC_Configuration();

//RTC_configuration();

GPIO_Configuration();

NVIC_Configuration();

EXTI_Configuration();

Motor_Init(000);//TIM1关闭状态不会触发TIM2

//屏蔽所有外部中断

EXTI->IMR=0;

if(LS1)

{

TIM_CCxCmd(TIM2TIM_Channel_1TIM_CCx_Disable);

Motor1_OriginFlag=1;

}

if(LS2)

{

TIM_CCxCmd(TIM2TIM_Channel_2TIM_CCx_Disable);

Motor2_OriginFlag=1;

}

if(LS3)

{

TIM_CCxCmd(TIM2TIM_Channel_3TIM_CCx_Disable);

Motor3_OriginFlag=1;

}

Delay_Ms(1000);

//开启所有外部中断

EXTI->IMR=0x07;

while(!

Motor1_OriginFlag|!

Motor2_OriginFlag|!

Motor3_OriginFlag)

{

TIM1_TIM2_PWM(10003200);//让没有回到原位的导轨滑块回到原位用于初始状态的调平基准

}

//屏蔽所有外部中断

EXTI->IMR=0;

TIM_Cmd(TIM1DISABLE);//关闭TIM1

TIM1->CNT=0;//定时器1当前计数值清零

TIM2->CNT=0;//定时器2当前计数值清零

Delay_Ms(1000);

Motor1_UP;//电机1上升

Motor2_UP;//电机2上升

Motor3_UP;//电机3上升

TIM_CCxCmd(TIM2TIM_Channel_1TIM_CCx_Enable);//使能TIM2->CH1通道PWM输出

TIM_CCxCmd(TIM2TIM_Channel_2TIM_CCx_Enable);//使能TIM2->CH2通道PWM输出

TIM_CCxCmd(TIM2TIM_Channel_3TIM_CCx_Enable);//使能TIM2->CH3通道PWM输出

 

TIM_ITConfig(TIM1TIM_IT_UpdateENABLE);//开启TIM1中断

Motor_Arrived=0;

TIM1_TIM2_PWM(10001600);

while(!

Motor_Arrived);

 

Motor_Arrived=0;

TIM1_TIM2_PWM(7003200);

while(!

Motor_Arrived);

Motor1_DOWN;//电机1下降

Motor2_DOWN;//电机2下降

Motor3_DOWN;//电机3下降

Motor_Arrived=0;

TIM1_TIM2_PWM(5001600);

while(!

Motor_Arrived);

//====================================F1=========================================

TIM_CCxCmd(TIM2TIM_Channel_1TIM_CCx_Disable);//关闭TIM2->CH1通道PWM输出

TIM_CCxCmd(TIM2TIM_Channel_2TIM_CCx_Enable);//使能TIM2->CH2通道PWM输出

TIM_CCxCmd(TIM2TIM_Channel_3TIM_CCx_Disable);//关闭TIM2->CH3通道PWM输出

Motor_Arrived=0;

Motor2_UP;//电机2上升

TIM1_TIM2_PWM(1500500);//2#电机上升

while(!

Motor_Arrived);

delay_ms(2000);

TIM_CCxCmd(TIM2TIM_Channel_1TIM_CCx_Enable);//使能TIM2->CH1通道PWM输出

TIM_CCxCmd(TIM2TIM_Channel_2TIM_CCx_Disable);//关闭TIM2->CH2通道PWM输出

TIM_CCxCmd(TIM2TIM_Channel_3TIM_CCx_Disable);//关闭TIM2->CH3通道PWM输出

Motor_Arrived=0;

Motor1_UP;//电机1上升

TIM1_TIM2_PWM(15001500);//1#电机上升

while(!

Motor_Arrived);

delay_ms(3000);

//====================================F2=========================================

TIM_CCxCmd(TIM2TIM_Channel_1TIM_CCx_Disable);//关闭TIM2->CH1通道PWM输出

TIM_CCxCmd(TIM2TIM_Channel_2TIM_CCx_Enable);//使能TIM2->CH2通道PWM输出

TIM_CCxCmd(TIM2TIM_Channel_3TIM_CCx_Disable);//关闭TIM2->CH3通道PWM输出

Motor_Arrived=0;

Motor2_DOWN;//电机2下降

TIM1_TIM2_PWM(15002000);//2#电机下降

while(!

Motor_Arrived);

delay_ms(3000);

TIM_CCxCmd(TIM2TIM_Channel_1TIM_CCx_Disable);//关闭TIM2->CH1通道PWM输出

TIM_CCxCmd(TIM2TIM_Channel_2TIM_CCx_Disable);//关闭TIM2->CH2通道PWM输出

TIM_CCxCmd(TIM2TIM_Channel_3TIM_CCx_Enable);//使能TIM2->CH3通道PWM输出

Motor_Arrived=0;

Motor3_UP;//电机3上升

TIM1_TIM2_PWM(15001500);//3#电机上升

while(!

Motor_Arrived);

delay_ms(3000);

 

TIM_CCxCmd(TIM2TIM_Channel_1TIM_CCx_Enable);//使能TIM2->CH1通道PWM输出

TIM_CCxCmd(TIM2TIM_Channel_2TIM_CCx_Disable);//关闭TIM2->CH2通道PWM输出

TIM_CCxCmd(TIM2TIM_Channel_3TIM_CCx_Disable);//关闭TIM2->CH3通道PWM输出

Motor_Arrived=0;

Motor1_DOWN;//电机1下降

TIM1_TIM2_PWM(15002500);//1#电机下降

while(!

Motor_Arrived);

delay_ms(3000);

//===================================F3=========================================

TIM_CCxCmd(TIM2TIM_Channel_1TIM_CCx_Disable);//关闭TIM2->CH1通道PWM输出

TIM_CCxCmd(TIM2TIM_Channel_2TIM_CCx_Enable);//使能TIM2->CH2通道PWM输出

TIM_CCxCmd(TIM2TIM_Channel_3TIM_CCx_Disable);//关闭TIM2->CH3通道PWM输出

Motor_Arrived=0;

Motor2_UP;//电机2上升

TIM1_TIM2_PWM(15003000);//2#电机上升

while(!

Motor_Arrived);

delay_ms(2000);

//====================================F4=========================================

TIM_CCxCmd(TIM2TIM_Channel_1TIM_CCx_Enable);//使能TIM2->CH1通道PWM输出

TIM_CCxCmd(TIM2TIM_Channel_2TIM_CCx_Disable);//关闭TIM2->CH2通道PWM输出

TIM_CCxCmd(TIM2TIM_Channel_3TIM_CCx_Disable);//关闭TIM2->CH3通道PWM输出

Motor_Arrived=0;

Motor1_UP;//电机1上升

TIM1_TIM2_PWM(15002500);//1#电机上升

while(!

Motor_Arrived);

delay_ms(3000);

//====================================F5=========================================

TIM_CCxCmd(TIM2TIM_Channel_1TIM_CCx_Disable);//关闭TIM2->CH1通道PWM输出

TIM_CCxCmd(TIM2TIM_Channel_2TIM_CCx_Disable);//关闭TIM2->CH2通道PWM输出

TIM_CCxCmd(TIM2TIM_Channel_3TIM_CCx_Enable);//使能TIM2->CH3通道PWM输出

Motor_Arrived=0;

Motor3_UP;//电机3上升

TIM1_TIM2_PWM(15002500);//3#电机上升

while(!

Motor_Arrived);

delay_ms(3000);

//====================================F6=========================================

TIM_CCxCmd(TIM2TIM_Channel_1TIM_CCx_Disable);//关闭TIM2->CH1通道PWM输出

TIM_CCxCmd(TIM2TIM_Channel_2TIM_CCx_Enable);//使能TIM2->CH2通道PWM输出

TIM_CCxCmd(TIM2TIM_Channel_3TIM_CCx_Disable);//关闭TIM2->CH3通道PWM输出

Motor_Arrived=0;

Motor2_UP;//电机2上升

TIM1_TIM2_PWM(15003000);//2#电机上升

while(!

Motor_Arrived);

delay_ms(2000);

//================================F7回原位======================================

TIM_CCxCmd(TIM2TIM_Channel_1TIM_CCx_Enable);//使能TIM2->CH1通道PWM输出

TIM_CCxCmd(TIM2TIM_Channel_2TIM_CCx_Disable);//关闭TIM2->CH2通道PWM输出

TIM_CCxCmd(TIM2TIM_Channel_3TIM_CCx_Disable);//关闭TIM2->CH3通道PWM输出

Motor_Arrived=0;

TIM1_TIM2_PWM(15003000);//1#电机上升

while(!

Motor_Arrived);

 

TIM_CCxCmd(TIM2TIM_Channel_1TIM_CCx_Disable);//关闭TIM2->CH1通道PWM输出

TIM_CCxCmd(TIM2TIM_Channel_2TIM_CCx_Disable);//关闭TIM2->CH2通道PWM输出

TIM_CCxCmd(TIM2TIM_Channel_3TIM_CCx_Enable);//使能TIM2->CH3通道PWM输出

Motor_Arrived=0;

Motor3_UP;//电机3上升

TIM1_TIM2_PWM(1500500);//3#电机上升

while(!

Motor_Arrived);

delay_ms(2000);

for(i=0;i<5;++i)

{

BUZZER=!

BUZZER;

delay_ms(200);

}

BUZZER=0;//蜂鸣器复位

while

(1)

{

LED2=1;

LED3=1;

LED1=1;

delay_ms(1000);

LED1=0;

delay_ms(1000);

}

}

 

//==========================子程序入口=================================

/**

*@brief时钟配置

*@paramNone

*@retvalNone

*/

//外部晶振为8MPLLCLK=SYSCLK=72MHCLK=72MP2CLK=72MP1CLK=36MADCCLK=36MUSBCLK=48MTIMCLK=72M

voidRCC_Configuration(void)

{

ErrorStatusHSEStartUpStatus;//定义错误状态枚举变量ERRORSUCCESS

RCC_DeInit();//RCC寄存器重新设置为默认值

RCC_HSEConfig(RCC_HSE_ON);//打开外部高速时钟晶振

HSEStartUpStatus=RCC_WaitForHSEStartUp();//等待外部高速时钟工作

if(HSEStartUpStatus==SUCCESS)

{

 

RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置AHB不分频HCLK=SYSCLK

RCC_PCLK2Config(RCC_HCLK_Div1);//设置APB2不分频P2CLK=HCLK

RCC_PCLK1Config(RCC_HCLK_Div2);//设置APB1为2分频P1CLK=HCLK/2

FLASH_SetLatency(FLASH_Latency_2);//设置FLASH代码延时

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//设置预取指缓存

RCC_PLLConfig(RCC_PLLSource_HSE_Div1RCC_PLLMul_9);//设置PLL时钟外部时钟不分频为HSE的9倍频8MhZ*9=72MHZ

RCC_PLLCmd(ENABLE);//使能PLL

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);//等待PLL准备就绪

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//设置PLL为系统时钟源

while(RCC_GetSYSCLKSource()!

=0x08);//判断PLL是否为系统时钟源

}

}

 

/**

*@briefRTC实时时钟配置

*@paramNone

*@retvalNone

*/

voidRTC_configuration(void)

{

RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP|RCC_APB1Periph_PWRENABLE);

PWR_BackupAccessCmd(ENABLE);

BKP_DeInit();

RCC_LSEConfig(RCC_LSE_ON);

while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET);

RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

RCC_RTCCLKCmd(ENABLE);

RTC_WaitForSynchro();

RTC_WaitForLastTask();

 

RTC_WaitForLastTask();

RTC_SetPrescaler(32767);

RTC_WaitForLastTask();

PWR_BackupAccessCmd(DISABLE);

}

 

/**

*@briefSTM32主板按键查询函数

*@paramNone

*@retvalNone

*/

voidKeyRe

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 政史地

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1