0
点赞
收藏
分享

微信扫一扫

基于Stm32F103C8T6的循迹避障小车,机械臂蓝牙遥控小车

这篇文章主要基于两个STM32F103c8t6芯片的双车

1.基于Stm32f103c8t6下坡停循迹避障感应停车 下坡停:小车在从坡道到平地第一时刻会停车任意时间 循迹:循电磁线的轨迹,有环岛的电磁线轨迹 避障:在检测到小车侧边的障碍物后会停留任意时间 感应停车:到达终点感应到干簧管后停车并挥旗
2.基于Stm32f103c8t6蓝牙机械臂小车(小挖机) 蓝牙:HC-05 or zigbee,实现对小车的遥控 机械臂:由MG996舵机和机械结构组成的机械臂可以夹取物块 上台结构:由机械制作的结构可以使小车上到高台
3.对蓝牙机械臂小车进行遥控的遥控器代码

下坡停循迹避障感应停车的代码

#include "stm32f10x.h"
#include "motor.h"
#include "usart.h"
#include "action.h"
//#include "timer.h"
#include "duoji.h"
#include "delay.h"
#include "sys.h"
#include "math.h"
#include "pwm.h"

extern int a1;

int main(void)
{
	int i=0;
	delay_init();
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //ÉèÖÃNVICÖжϷÖ×é2:2λÇÀÕ¼ÓÅÏȼ¶£¬2λÏìÓ¦ÓÅÏȼ¶
	motor_init();//µç»ú³õʼ»¯
	uart_init(9600);//´®¿Ú³õʼ»¯	
	TIM4_PB6_pwm_init(899,0);                                  
   TIM4_PB7_pwm_init(899,0);
   TIM4_PB8_pwm_init(899,0);
   TIM4_PB9_pwm_init(899,0);
	TIM3_OC1_PWM_Init(1999,719);
	TIM3_OC2_PWM_Init(1999,719);
	TIM3_OC3_PWM_Init(1999,719);
	
	while(1)
	{
		if(i==0)
		{
			a1=200;
			TIM_SetCompare2(TIM3,a1);				
			i=1;	
		}			
	}
}

以上为主函数中代码,接下来的是各个模块的代码。
电机的代码如下,是小车的运动程序,驱动使用的是L298N,电机为常用的铁电机。

#include "motor.h"
#include "stm32f10x.h"
                                                                                
void motor_init(void)       //µç»ú³õʼ»¯
{
	GPIO_InitTypeDef GPIO_InitStruct;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //ʹÄÜGPIOA
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4 |GPIO_Pin_5 |GPIO_Pin_8 |GPIO_Pin_11;//¶Ë¿ÚÅäÖÃ
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;	         //ÉèÖÃΪǿÍÆÍìÊä³ö                                
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);

}

void motor_1_q(void)
	{		
		GPIO_SetBits(GPIOB,GPIO_Pin_6);  //¸ßµçƽ
		GPIO_ResetBits(GPIOA,GPIO_Pin_4); //µÍµçƽ
	}
void motor_1_t(void)
	{
		GPIO_ResetBits(GPIOB,GPIO_Pin_6); //µÍµçƽ
		GPIO_ResetBits(GPIOA,GPIO_Pin_4);//µÍµçƽ
	}
void motor_1_h(void)
	{
		GPIO_ResetBits(GPIOB,GPIO_Pin_6);//µÍµçƽ
		GPIO_SetBits(GPIOA,GPIO_Pin_4);  //¸ßµçƽ 
	}
		
void motor_2_q(void)
	{
		GPIO_SetBits(GPIOB,GPIO_Pin_7);  //¸ßµçƽ
		GPIO_ResetBits(GPIOA,GPIO_Pin_5); //µÍµçƽ
	}
void motor_2_t(void)
	{
		GPIO_ResetBits(GPIOB,GPIO_Pin_7); //µÍµçƽ
		GPIO_ResetBits(GPIOA,GPIO_Pin_5); //µÍµçƽ
	}
void motor_2_h(void)
	{
		GPIO_ResetBits(GPIOB,GPIO_Pin_7); //µÍµçƽ
		GPIO_SetBits(GPIOA,GPIO_Pin_5);  //¸ßµçƽ   
	}
	/*ÉÏÃæÊÇ×ó±ßÁ½¸ö³µÂÖ*/	
void motor_3_q(void)
	{
		GPIO_SetBits(GPIOB,GPIO_Pin_8);	//¸ßµçƽ
		GPIO_ResetBits(GPIOA,GPIO_Pin_8);//µÍµçƽ
	}
void motor_3_t(void)
	{	
		GPIO_ResetBits(GPIOB,GPIO_Pin_8);//µÍµçƽ
		GPIO_ResetBits(GPIOA,GPIO_Pin_8);//µÍµçƽ
	}
void motor_3_h(void)
	{
		GPIO_ResetBits(GPIOB,GPIO_Pin_8);//µÍµçƽ
		GPIO_SetBits(GPIOA,GPIO_Pin_8);//¸ßµçƽ
	}
	
void motor_4_q(void)
	{
		GPIO_SetBits(GPIOB,GPIO_Pin_9); //¸ßµçƽ
		GPIO_ResetBits(GPIOA,GPIO_Pin_11); //µÍµçƽ
	}
void motor_4_t(void)
	{	
		GPIO_ResetBits(GPIOB,GPIO_Pin_9);  //µÍµçƽ
		GPIO_ResetBits(GPIOA,GPIO_Pin_11);  //µÍµçƽ
	}
void motor_4_h(void)
	{
		GPIO_ResetBits(GPIOB,GPIO_Pin_9);   //µÍµçƽ                
		GPIO_SetBits(GPIOA,GPIO_Pin_11);    //¸ßµçƽ                 
	}


下面的是.h文件中的定义

#ifndef _MOTOR_H_
#define _MOTOR_H_

void motor_init(void);            //µç»ú³õʼ»¯

void motor_1_q(void);
void motor_1_t(void);
void motor_1_h(void);

void motor_2_q(void);
void motor_2_t(void);
void motor_2_h(void);

void motor_3_q(void);
void motor_3_t(void);
void motor_3_h(void);

void motor_4_q(void);
void motor_4_t(void);
void motor_4_h(void);


#endif

接下来是小车的PWM控制,对小车进行PWM控制可以使小车以各种速度行走,主要用了定时器。

#include "pwm.h"
#include "stm32f10x.h"

void TIM4_PB6_pwm_init(int arr,int psc)
{
         GPIO_InitTypeDef GPIO_InitStructure;
         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrue;
	      TIM_OCInitTypeDef TIM_OCInitStruct;
	
			RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);

         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//¸´ÓÃÍÆÍìÊä³ö
			GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;                    
			GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
			GPIO_Init(GPIOB,&GPIO_InitStructure);	     
			
		//	GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);

	      TIM_TimeBaseInitStrue.TIM_Period=arr;//ÖØ×°Ô¤Öµ
			TIM_TimeBaseInitStrue.TIM_Prescaler=psc;      //Ô¤·ÖƵϵÊý
			TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up;     //ÏòÉϼÆÊý
			TIM_TimeBaseInitStrue.TIM_ClockDivision=TIM_CKD_DIV1;//ʱÖÓ·Ö¸î
		   TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStrue);    //³õʼ»¯¶¨Ê±Æ÷

	      TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;    //pwm1ģʽ
	      TIM_OCInitStruct.TIM_OCNPolarity=TIM_OCPolarity_High;     //¼«ÐԸߵçƽÓÐЧ
	      TIM_OCInitStruct.TIM_OutputState= TIM_OutputState_Enable;  //Êä³öʹÄÜ´ò¿ª
			
	      TIM_OC1Init(TIM4,&TIM_OCInitStruct);       //³õʼ»¯Êä³ö±È½Ï²ÎÊý
		   TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); 

	      TIM_Cmd(TIM4,ENABLE);
}

void TIM4_PB7_pwm_init(int arr,int psc)
{
       GPIO_InitTypeDef GPIO_InitStructure;
       TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrue;
	    TIM_OCInitTypeDef TIM_OCInitStruct;
	
		 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
       RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
 
       GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;   //¸´ÓÃÍÆÍìÊä³ö
		 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;
		 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
		 GPIO_Init(GPIOB,&GPIO_InitStructure);	
			
		//	GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);

	    TIM_TimeBaseInitStrue.TIM_Period=arr;      //ÖØ×°Ô¤Öµ
		 TIM_TimeBaseInitStrue.TIM_Prescaler=psc;       //Ô¤·ÖƵϵÊý
		 TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up;     //ÏòÉϼÆÊý
		 TIM_TimeBaseInitStrue.TIM_ClockDivision=TIM_CKD_DIV1;     //ʱÖÓ·Ö¸î
		 TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStrue);   //³õʼ»¯¶¨Ê±Æ÷

	    TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;    //pwm1ģʽ
	    TIM_OCInitStruct.TIM_OCNPolarity=TIM_OCPolarity_High;    //¼«ÐԸߵçƽÓÐЧ
	    TIM_OCInitStruct.TIM_OutputState= TIM_OutputState_Enable;     //Êä³öʹÄÜ´ò¿ª
			
	    TIM_OC2Init(TIM4,&TIM_OCInitStruct);   //³õʼ»¯Êä³ö±È½Ï²ÎÊý
		 TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable); 

	    TIM_Cmd(TIM4,ENABLE);
}

void TIM4_PB8_pwm_init(int arr,int psc)
{
      GPIO_InitTypeDef GPIO_InitStructure;
      TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrue;
	   TIM_OCInitTypeDef TIM_OCInitStruct;
	
		RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);

      GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;  //¸´ÓÃÍÆÍìÊä³ö
		GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
		GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
		GPIO_Init(GPIOB,&GPIO_InitStructure);	
			
		//	GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);

	   TIM_TimeBaseInitStrue.TIM_Period=arr;   //ÖØ×°Ô¤Öµ
		TIM_TimeBaseInitStrue.TIM_Prescaler=psc;        //Ô¤·ÖƵϵÊý
		TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up;   //ÏòÉϼÆÊý
		TIM_TimeBaseInitStrue.TIM_ClockDivision=TIM_CKD_DIV1;    //ʱÖÓ·Ö¸î
		TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStrue);     //³õʼ»¯¶¨Ê±Æ÷

	   TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;     //pwm1ģʽ
	   TIM_OCInitStruct.TIM_OCNPolarity=TIM_OCPolarity_High;    //¼«ÐԸߵçƽÓÐЧ
	   TIM_OCInitStruct.TIM_OutputState= TIM_OutputState_Enable;   //Êä³öʹÄÜ´ò¿ª
			
	   TIM_OC3Init(TIM4,&TIM_OCInitStruct);      //³õʼ»¯Êä³ö±È½Ï²ÎÊý
		TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable); 

	   TIM_Cmd(TIM4,ENABLE);
}

void TIM4_PB9_pwm_init(int arr,int psc)
{
        GPIO_InitTypeDef GPIO_InitStructure;//¶Ë¿Ú³õʼ»¯
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrue;
	     TIM_OCInitTypeDef TIM_OCInitStruct;//ͨµÀ³õʼ»¯
	
		  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);

        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//¸´ÓÃÍÆÍìÊä³ö
		  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
		  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
		  GPIO_Init(GPIOB,&GPIO_InitStructure);	
			
		//	GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);

	     TIM_TimeBaseInitStrue.TIM_Period=arr;//ÖØ×°Ô¤Öµ
		  TIM_TimeBaseInitStrue.TIM_Prescaler=psc;//Ô¤·ÖƵϵÊý
		  TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up;//ÏòÉϼÆÊý
		  TIM_TimeBaseInitStrue.TIM_ClockDivision=TIM_CKD_DIV1;//ʱÖÓ·Ö¸î
		  TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStrue);//³õʼ»¯¶¨Ê±Æ÷

	     TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;             //pwm1ģʽ
	     TIM_OCInitStruct.TIM_OCNPolarity=TIM_OCPolarity_High;    //¼«ÐԸߵçƽÓÐЧ
	     TIM_OCInitStruct.TIM_OutputState= TIM_OutputState_Enable;  //Êä³öʹÄÜ´ò¿ª
			
	     TIM_OC4Init(TIM4,&TIM_OCInitStruct);   //³õʼ»¯Êä³ö±È½Ï²ÎÊý
		  TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable); 

	     TIM_Cmd(TIM4,ENABLE);
}

接下来的是pwm的.h文件

#ifndef __PWM_H_
#define __PWM_H_

#include "stm32f10x.h"

/**********************************ËĸöͨµÀ**************************/
void TIM4_PB6_pwm_init(int arr,int psc);                                  
void TIM4_PB7_pwm_init(int arr,int psc);
void TIM4_PB8_pwm_init(int arr,int psc);
void TIM4_PB9_pwm_init(int arr,int psc);


#endif


接下来的是小车运行的底层代码,主要是四个轮子状态的组合使小车有不同的动作。

#include "action.h"
#include "motor.h"
#include "pwm.h"
#include "timer.h"

void Advance()//Ç°½ø
{
	motor_1_q();
	motor_2_q();
	motor_3_q();
	motor_4_q();
	TIM_SetCompare1(TIM4,899);		 
	TIM_SetCompare2(TIM4,899);	    
	TIM_SetCompare3(TIM4,899);	   
	TIM_SetCompare4(TIM4,899);

}

void Retreat()//ºóÍË
{
	motor_1_h();
	motor_2_h();
	motor_3_h();
	motor_4_h();
	TIM_SetCompare1(TIM4,0);		 
	TIM_SetCompare2(TIM4,0);	 
	TIM_SetCompare3(TIM4,0);	    
	TIM_SetCompare4(TIM4,0);

}

void Stop()//Í£Ö¹
{
	motor_1_t();
	motor_2_t();
	motor_3_t();
	motor_4_t();
	TIM_SetCompare1(TIM4,0);		 
	TIM_SetCompare2(TIM4,0);	   
	TIM_SetCompare3(TIM4,0);	    
	TIM_SetCompare4(TIM4,0);


}

void Returnleft()//×óת
{
	motor_1_h();
	motor_2_h();
	motor_3_q();
	motor_4_q();
	TIM_SetCompare1(TIM4,0);		
	TIM_SetCompare2(TIM4,0);	    
	TIM_SetCompare3(TIM4,899);	  
	TIM_SetCompare4(TIM4,899);
	
}

void Returnright()//ÓÒת
{
	motor_1_q();
	motor_2_q();
	motor_3_h();
	motor_4_h();
	TIM_SetCompare1(TIM4,899);		
	TIM_SetCompare2(TIM4,899);	  
	TIM_SetCompare3(TIM4,0);	   
	TIM_SetCompare4(TIM4,0);
	
}

void Rash()   //Ö±×ß¼ÓËÙ
{
	motor_1_q();
	motor_2_q();
	motor_3_q();
	motor_4_q();
	TIM_SetCompare1(TIM4,899);		 
	TIM_SetCompare2(TIM4,899);	   
	TIM_SetCompare3(TIM4,899);	    
	TIM_SetCompare4(TIM4,899);
	

}


motor.h文件如下

#include "motor.h"

void Advance(void);
void Rash(void);
void Retreat(void);
void Returnleft(void);
void Returnright(void);
void Stop(void);


接下来的是MG996舵机的代码,也是机械臂必须有且最难的代码,主要用了定时器的pwm对舵机进行精准控制。

#include "duoji.h"
#include "stm32f10x.h"
#include "sys.h"
#include "math.h"
#include "delay.h"
/**********************************************
          ¶¨Ê±Æ÷3µÄͨµÀ1Êä³öpwm³õʼ»¯
************************************************/
void TIM3_OC1_PWM_Init(u16 arr31,u16 psc31)	// ¶¨Ê±Æ÷3µÄͨµÀ1Êä³öpwm³õʼ»¯
{
//˵Ã÷£º¶¨Òå½á¹¹Ìå±ØÐë·ÅÔÚº¯Êýʼ¶Ë½øÐÐÉùÃ÷£¬²»È»±àÒëÆ÷»á±¨´í
	
GPIO_InitTypeDef  GPIO_InitStructure;//GPIO¶Ë¿Ú³õʼ»¯½á¹¹Ìå  ½á¹¹ÌåÃû	
TIM_TimeBaseInitTypeDef	TIM_TimeBaseInitStructure;//¶¨Ê±Æ÷3³õʼ»¯½á¹¹Ìå  ½á¹¹ÌåÃû	
TIM_OCInitTypeDef TIM_OCInitStructure;//ͨµÀ1³õʼ»¯½á¹¹Ìå  ½á¹¹ÌåÃû	
	
/*	GPIO¶Ë¿Ú³õʼ»¯*/

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6 ;//¶Ë¿Ú
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//ËÙ¶È
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;//	ģʽ£º¸´ÓÃÍÆÍìÊä³ö	
GPIO_Init(GPIOA,&GPIO_InitStructure);//GPIOA.4³õʼ»¯

/*ʱÖÓʹÄÜ*/	
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);//GOIOAʱÖÓʹÄÜ£¬¶Ë¿Ú¸´Óù¦Äܶ˿ÚʱÖÓʹÄÜ
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//	¶¨Ê±Æ÷3ʱÖÓʹÄÜ

/*¶Ë¿ÚÖØÓ³Éä*/	
//GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);//½«¶¨Ê±Æ÷3µÄͨµÀ
	
/*¶¨Ê±Æ÷3³õʼ»¯*/		

TIM_TimeBaseInitStructure.TIM_ClockDivision=0;//·ÖƵģʽΪ²»·ÖƵ
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;	//ģʽΪÏòÉϼÆÊýģʽ
TIM_TimeBaseInitStructure.TIM_Period=1999;//ÉèÖÃÔÚÏÂÒ»¸ö¸üÐÂʼþ×°Èë»î¶¯µÄ×Ô¶¯ÖØ×°ÔؼĴæÆ÷ÖÜÆÚµÄÖµ
TIM_TimeBaseInitStructure.TIM_Prescaler=719;//ÉèÖÃÓÃÀ´×÷ΪTIMxʱÖÓƵÂʳýÊýµÄÔ¤·ÖƵֵ 
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//¶¨Ê±Æ÷3³õʼ»¯

/*ͨµÀ1³õʼ»¯º¯Êý*/	

TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//ģʽΪpwmģʽ1£¬Ñ¡Ôñ¶¨Ê±Æ÷ģʽ:TIMÂö³å¿í¶Èµ÷ÖÆģʽ1
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//Êä³ö¼«ÐÔΪ¸ß
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;±È½ÏÊä³öʹÄÜ
TIM_OC1Init(TIM3,&TIM_OCInitStructure);//ͨµÀ1³õʼ»¯

TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable); //ʹÄÜTIM3ÔÚCCR2ÉϵÄԤװÔؼĴæÆ÷

TIM_Cmd(TIM3,ENABLE);//ʹÄܶ¨Ê±Æ÷3
}	

/**********************************************
          ¶¨Ê±Æ÷3µÄͨµÀ2Êä³öpwm³õʼ»¯
************************************************/
void TIM3_OC2_PWM_Init(u16 arr32,u16 psc32)	// ¶¨Ê±Æ÷3µÄͨµÀ2Êä³öpwm³õʼ»¯
{
//˵Ã÷£º¶¨Òå½á¹¹Ìå±ØÐë·ÅÔÚº¯Êýʼ¶Ë½øÐÐÉùÃ÷£¬²»È»±àÒëÆ÷»á±¨´í
	
GPIO_InitTypeDef  GPIO_InitStructure;//GPIO¶Ë¿Ú³õʼ»¯½á¹¹Ìå  ½á¹¹ÌåÃû	
TIM_TimeBaseInitTypeDef	TIM_TimeBaseInitStructure;//¶¨Ê±Æ÷3³õʼ»¯½á¹¹Ìå  ½á¹¹ÌåÃû	
TIM_OCInitTypeDef TIM_OCInitStructure;//ͨµÀ³õʼ»¯½á¹¹Ìå  ½á¹¹ÌåÃû	
	
/*	GPIO¶Ë¿Ú³õʼ»¯*/

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;//¶Ë¿Ú
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//ËÙ¶È
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;//	ģʽ£º¸´ÓÃÍÆÍìÊä³ö	
GPIO_Init(GPIOA,&GPIO_InitStructure);//³õʼ»¯

/*ʱÖÓʹÄÜ*/	
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);//GOIOBʱÖÓʹÄÜ£¬¶Ë¿Ú¸´Óù¦Äܶ˿ÚʱÖÓʹÄÜ
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//	¶¨Ê±Æ÷3ʱÖÓʹÄÜ

/*¶Ë¿ÚÖØÓ³Éä*/	
//GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);//½«¶¨Ê±Æ÷3µÄͨµÀ2
	
/*¶¨Ê±Æ÷3³õʼ»¯*/		

TIM_TimeBaseInitStructure.TIM_ClockDivision=0;//·ÖƵģʽΪ²»·ÖƵ
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;	//ģʽΪÏòÉϼÆÊýģʽ
TIM_TimeBaseInitStructure.TIM_Period=1999;//ÉèÖÃÔÚÏÂÒ»¸ö¸üÐÂʼþ×°Èë»î¶¯µÄ×Ô¶¯ÖØ×°ÔؼĴæÆ÷ÖÜÆÚµÄÖµ
TIM_TimeBaseInitStructure.TIM_Prescaler=719;//ÉèÖÃÓÃÀ´×÷ΪTIMxʱÖÓƵÂʳýÊýµÄÔ¤·ÖƵֵ 
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//¶¨Ê±Æ÷3³õʼ»¯

/*ͨµÀ2³õʼ»¯º¯Êý*/	

TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//ģʽΪpwmģʽ1£¬Ñ¡Ôñ¶¨Ê±Æ÷ģʽ:TIMÂö³å¿í¶Èµ÷ÖÆģʽ1
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//Êä³ö¼«ÐÔΪ¸ß
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//±È½ÏÊä³öʹÄÜ
TIM_OC2Init(TIM3,&TIM_OCInitStructure);//ͨµÀ2³õʼ»¯

TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable); //ʹÄÜTIM3ÔÚCCR2ÉϵÄԤװÔؼĴæÆ÷

TIM_Cmd(TIM3,ENABLE);//ʹÄܶ¨Ê±Æ÷3
}	

/**********************************************
          ¶¨Ê±Æ÷3µÄͨµÀ3Êä³öpwm³õʼ»¯
************************************************/
void TIM3_OC3_PWM_Init(u16 arr33,u16 psc33)	// ¶¨Ê±Æ÷3µÄͨµÀ2Êä³öpwm³õʼ»¯
{
//˵Ã÷£º¶¨Òå½á¹¹Ìå±ØÐë·ÅÔÚº¯Êýʼ¶Ë½øÐÐÉùÃ÷£¬²»È»±àÒëÆ÷»á±¨´í
	
GPIO_InitTypeDef  GPIO_InitStructure;//GPIO¶Ë¿Ú³õʼ»¯½á¹¹Ìå  ½á¹¹ÌåÃû	
TIM_TimeBaseInitTypeDef	TIM_TimeBaseInitStructure;//¶¨Ê±Æ÷3³õʼ»¯½á¹¹Ìå  ½á¹¹ÌåÃû	
TIM_OCInitTypeDef TIM_OCInitStructure;//ͨµÀ2³õʼ»¯½á¹¹Ìå  ½á¹¹ÌåÃû	
	
/*	GPIO¶Ë¿Ú³õʼ»¯*/

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//¶Ë¿Ú
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//ËÙ¶È
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;//	ģʽ£º¸´ÓÃÍÆÍìÊä³ö	
GPIO_Init(GPIOB,&GPIO_InitStructure);//GPIOB.0³õʼ»¯

/*ʱÖÓʹÄÜ*/	
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);//GOIOBʱÖÓʹÄÜ£¬¶Ë¿Ú¸´Óù¦Äܶ˿ÚʱÖÓʹÄÜ
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//	¶¨Ê±Æ÷3ʱÖÓʹÄÜ


/*¶¨Ê±Æ÷3³õʼ»¯*/		

TIM_TimeBaseInitStructure.TIM_ClockDivision=0;//·ÖƵģʽΪ²»·ÖƵ
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;	//ģʽΪÏòÉϼÆÊýģʽ
TIM_TimeBaseInitStructure.TIM_Period=1999;//ÉèÖÃÔÚÏÂÒ»¸ö¸üÐÂʼþ×°Èë»î¶¯µÄ×Ô¶¯ÖØ×°ÔؼĴæÆ÷ÖÜÆÚµÄÖµ
TIM_TimeBaseInitStructure.TIM_Prescaler=719;//ÉèÖÃÓÃÀ´×÷ΪTIMxʱÖÓƵÂʳýÊýµÄÔ¤·ÖƵֵ 
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//¶¨Ê±Æ÷3³õʼ»¯

/*ͨµÀ3³õʼ»¯º¯Êý*/	

TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//ģʽΪpwmģʽ1£¬Ñ¡Ôñ¶¨Ê±Æ÷ģʽ:TIMÂö³å¿í¶Èµ÷ÖÆģʽ1
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//Êä³ö¼«ÐÔΪ¸ß
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;±È½ÏÊä³öʹÄÜ
TIM_OC3Init(TIM3,&TIM_OCInitStructure);//ͨµÀ3³õʼ»¯

TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable); //ʹÄÜTIM3ÔÚCCR2ÉϵÄԤװÔؼĴæÆ÷

TIM_Cmd(TIM3,ENABLE);//ʹÄܶ¨Ê±Æ÷3
}	


int a1;
extern  int a1;

	/*¶æ»ú2×¥*/   
void duoji1(void)
{
		TIM_SetCompare1(TIM3,50);
		delay_ms(10);
}

		/*¶æ»ú2צ¿ª*/
void duoji2(void)
{
		TIM_SetCompare1(TIM3,135);
		delay_ms(10);
}
	/*¶æ»ú1ÏÂ*/
void duoji3(void)
{
		a1=a1+10;
		if(a1>200)
		{a1=200;}
		TIM_SetCompare2(TIM3,a1);
		delay_ms(10);

}
	  /*¶æ»ú1̧*/
void duoji4(void)
{
		a1=a1-14;
		if(a1<50)
		{a1=50;}
		TIM_SetCompare2(TIM3,a1);
		delay_ms(10);

}
	/*¶æ»ú3Âä*/
void duoji5(void)
{
		TIM_SetCompare3(TIM3,230);
		delay_ms(10);

}
	/*¶æ»ú3Éý*/
void duoji6(void)
{
		TIM_SetCompare3(TIM3,100);
		delay_ms(10);

}



舵机的.h文件

#ifndef __DUOJI_h
#define __DUOJI_h
#include "stm32f10x.h"
void TIM3_OC1_PWM_Init(u16 arr31,u16 psc31);
void TIM3_OC2_PWM_Init(u16 arr32,u16 psc32);
void TIM3_OC3_PWM_Init(u16 arr33,u16 psc33);
//void TIM3_OC4_PWM_Init(u16 arr34,u16 psc34);

//void TIM2_OC3_PWM_Init(u16 arr23,u16 psc23);
//void TIM2_OC4_PWM_Init(u16 arr24,u16 psc24);

void duoji1(void);
void duoji2(void);
void duoji3(void);
void duoji4(void);
void duoji5(void);
void duoji6(void);



#endif

看到这里,说明你是有心要做这么一辆车来玩玩并且学习STM32的!祝你好运(软件只是一部分,硬件的调试可能更让人头疼,来自一个一星期被蓝牙失灵整恶心的玩家时隔半年后的吐槽)!这就是第一辆车的所有代码啦!第二辆车和遥控器的代码看我下一篇文章!该项目的材料和成果展示我也会在后面的视频发链接!加油!电子人!(这是我大一暑假做的,当时已经系统学习过51和32,C也很通透了,做项目虽然苦,但有朋友并肩作战的岁月也很难忘!)

举报

相关推荐

0 条评论