这篇文章主要基于两个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也很通透了,做项目虽然苦,但有朋友并肩作战的岁月也很难忘!)