基于STM32RCT6MINI制作简单的寻迹小车

1.介绍

随着机械、电子、控制、信息等技术的飞速发展在其他技术方面,智能机器人有着广阔的应用前景。今天,我们希望通过追踪车走进智能之门。
在本次实验中,我们希望将所学的C语言知识加以应用,结合起来用探索的stm32单片机来完成对电机进行控制,使小车能够完成可变要求速度驾驶和转弯。

1.1目的

只有应用我们所学到的知识,才能使知识发挥其价值和作用同时加深了我们对知识的理解。从这里开始重点,希望通过car项目真正应用C语言。而且在完成项目的过程中,你会接触到很多你想要的那些不明白的东西。这样,他们可以学习和应用新的知识与更高以目标为导向的方式提高效率。最重要的是我们会在实验中遇到各种困难,提高自己解决问题的能力
问题也是我们实验的重要意义。

1.2假设

在实验中,我们将学习如何用C语言编写程序,如何使用Keil烧录程序,了解PWM的原理,以及单片机如何实现微机控制PWM输出,控制电机转速。最后,我们将使汽车前进,后退,并根据需要转几秒钟并重复多次。您也可以将速度值设为变量随时改变。

理论

PWM,全称为脉冲宽度调制.PWM是一种数字化的方法对模拟信号电平进行编码。通过使用高分辨率计数器方波的占空比被调制以编码特定模拟的电平信号。
PWM有两个重要参数:频率和占空比。频率调制可以通过改变每单位时间的脉冲数来实现;电压调制可以通过改变占空比来实现。占空比越大,获得的平均电压越大,振幅也越大占空比越小,获得的平均电压越小,电压越低振幅。
Figure 1: Schematic diagram of PWM principle
在图中,我们假设定时器在递增计数PWM模式下工作,并且
当CNT<CCRx时,输出0,当CNT>=CCRx时,输出1。那你呢可以得到以上PWM原理图:当CNT值小于CCRx,当CNT值大于或等于时,IO输出低电平(0)至CCRx。此时,IO输出高电平(1)。当CNT到达ARR值,它重置为零,然后再次计数,依次循环。更改CCRx的值,可以改变PWM输出的占空比,并改变ARR的值,你可以改变PWM。输出频率是原理脉宽调制输出占空比(D)的公式为:

D = T 1 / ( T 1 + T 2 ) D = T1/(T1+T2) D=T1/(T1+T2)

代码示例

motor.c

#include "motor.h"
#include "interface.h"
#include "stm32f10x.h"

//GPIO配置函数
void MotorGPIO_Configuration(void)
{
   		
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Pin = LEFT_F_PIN | LEFT_B_PIN | RIGHT_F_PIN | RIGHT_B_PIN;

	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 	
	GPIO_Init(LEFT_F_GPIO, &GPIO_InitStructure);    
	
	GPIO_InitStructure.GPIO_Pin = LEFT_B_PIN;	
	GPIO_Init(LEFT_B_GPIO, &GPIO_InitStructure); 
	
	GPIO_InitStructure.GPIO_Pin = RIGHT_F_PIN;	
	GPIO_Init(RIGHT_F_GPIO, &GPIO_InitStructure); 
	
	GPIO_InitStructure.GPIO_Pin = RIGHT_B_PIN;	
	GPIO_Init(RIGHT_B_GPIO, &GPIO_InitStructure); 
}
uint16_t p;

//根据占空比驱动电机转动
void CarMove(void)
{
      
	//左轮
	if(left_speed_duty > 0)//向前
	{
   
		if(speed_count < left_speed_duty)
		{
   
			LEFT_GO;
		}else
		{
   
			LEFT_STOP;
		}
	}
	else if(left_speed_duty < 0)//向后
	{
   
		if(speed_count < (-1)*left_speed_duty)
		{
   
			LEFT_BACK;
		}else
		{
   
			LEFT_STOP;
		}
	}
	else                //停止
	{
   
		LEFT_STOP;
	}
	
	//右轮
	if(right_speed_duty > 0)//向前
	{
   
		if(speed_count < right_speed_duty)
		{
   
			RIGHT_GO;
		}else                //停止
		{
   
			RIGHT_STOP;
		}
	}
	else if(right_speed_duty 
  • 7
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值