基于STM32单片机直流电机控制加减速正反转系统proteus仿真原理图程序

功能:
0.本项目采用STM32F103C8T6作为单片机系统的控制MCU
1.通过按键可以控制电机,正转、反转、加速、减速、停止。
2.总共六个功能按键可实现正转、反转、加速、减速、停止。
3.启停和正反转均有指示灯,测试采用的霍尔传感器方案
4.采用DC002作为电源接口可直接输入5V给整个系统供电

原理图:
在这里插入图片描述

PCB :
在这里插入图片描述

主程序:

#include "gpio.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include <stdio.h>
#include "timer.h"
#include "key.h"

unsigned char pwmRigh = 30; // pwm调整
unsigned char djs = 200;

char dis0[16]; // 暂存
char dis1[16]; // 暂存

unsigned char rekey = 0; // 按键防止抖动

unsigned char contNum = 0; // 循环计数

unsigned char motorFlag = 0;
unsigned char motorDir = 1;

int main(void)
{
	delay_init();	 // 延时函数初始化
	// uart_init(9600); // 串口初始化为9600
	//	uart2_init(9600)	;
	TIM3_Int_Init(9, 7199); // 2ms
	GPIO_LED_MOTOR_Init(); // 初始化与LED连接的硬件接口
	KEY_Init();

	MOTOR_INA = 1;
	MOTOR_INB = 1;
    
    LED_START = 1;
    LED_STOP = 0;
    LED_F = 0;
    LED_R = 1;
    
	pwmRigh = 30; // pwm调整

	delay_ms(100);

	while (1)
	{
		if ((KEY_START == 0) || (KEY_STOP == 0) || (KEY_F == 0) || (KEY_R == 0) || (KEY_ADD == 0) || (KEY_SUB == 0)) // 检测到按键按下
		{
			delay_ms(10); // 小抖动
			if (rekey == 0)
			{
				if (KEY_START == 0) //启动键
				{
					LED_START = 0;
					LED_STOP = 1;
					rekey = 1;
					motorFlag = 1;
				}
				else if (KEY_STOP == 0) //停止键
				{
					LED_START = 1;
					LED_STOP = 0;
					rekey = 1;
					motorFlag = 0;
				}
				else if (KEY_F == 0) //正转键
				{
					LED_F = 0;
					LED_R = 1;
					rekey = 1;
					motorDir = 1;
					MOTOR_INA = 1;
					MOTOR_INB = 1;
				}
				else if (KEY_R == 0) //反转键
				{
					LED_F = 1;
					LED_R = 0;
					rekey = 1;
					motorDir = 0;
					MOTOR_INA = 1;
					MOTOR_INB = 1;
				}
				else if (KEY_ADD == 0) //加速键
				{
					rekey = 1;
					if (pwmRigh < 50)
						pwmRigh = pwmRigh + 5; // pwm 调速
				}
				else if (KEY_SUB == 0) //减速键
				{
					rekey = 1;
					if (pwmRigh > 30)
						pwmRigh = pwmRigh - 5; // pwm 调速
				}
				
			}
		}
		else
		{
			rekey = 0; // 防止重复检测到按键
		}
		delay_ms(100);
	}
}

void pwmCtrl(void)
{
	static unsigned char countRigh;

	if (motorFlag == 1)
	{
		countRigh++;

		if (motorDir == 0)
		{
			if (countRigh < pwmRigh) // 占空比调节
			{
				MOTOR_INA = 0;
			}
			else if (countRigh <= 50) // 关闭时间段
			{
				MOTOR_INA = 1;
				if (countRigh == 50)
					countRigh = 0;
			}
		}
		else
		{
			if (countRigh < pwmRigh) // 占空比调节
			{
				MOTOR_INB = 0;
			}
			else if (countRigh <= 50) // 关闭时间段
			{
				MOTOR_INB = 1;
				if (countRigh == 50)
					countRigh = 0;
			}
		}
	}
	else
	{
		MOTOR_INA = 1;
		MOTOR_INB = 1;
	}
}

仿真演示视频:
https://www.bilibili.com/video/BV1Sg411p7VN/

实物演示视频:
https://www.bilibili.com/video/BV1s44y1D7Xj/

  • 4
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用STM32控制霍尔电机的反转。首先,你需要连接霍尔电机到STM32的合适引脚上。然后,你可以使用STM32的GPIO库来控制这些引脚。 以下是一个简单的示例代码,演示如何控制霍尔电机的反转: ```c #include "stm32f4xx.h" #define MOTOR_PIN1 GPIO_PIN_0 #define MOTOR_PIN2 GPIO_PIN_1 GPIO_InitTypeDef GPIO_InitStruct; void motor_init() { // 初始化GPIO引脚 __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = MOTOR_PIN1 | MOTOR_PIN2; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } void motor_forward() { // 设置引脚状态以实现转 HAL_GPIO_WritePin(GPIOA, MOTOR_PIN1, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOA, MOTOR_PIN2, GPIO_PIN_RESET); } void motor_backward() { // 设置引脚状态以实现反转 HAL_GPIO_WritePin(GPIOA, MOTOR_PIN1, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, MOTOR_PIN2, GPIO_PIN_SET); } void motor_stop() { // 设置引脚状态以停止电机 HAL_GPIO_WritePin(GPIOA, MOTOR_PIN1, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, MOTOR_PIN2, GPIO_PIN_RESET); } int main(void) { // 初始化STM32 HAL_Init(); // 初始化电机 motor_init(); while(1) { // 控制电机转 motor_forward(); HAL_Delay(1000); // 1秒钟 // 控制电机停止 motor_stop(); HAL_Delay(1000); // 1秒钟 // 控制电机反转 motor_backward(); HAL_Delay(1000); // 1秒钟 // 控制电机停止 motor_stop(); HAL_Delay(1000); // 1秒钟 } } ``` 请注意,这只是一个简单的示例代码,你可能需要根据你的具体硬件配置进行调整。另外,你需要使用适当的库和引脚配置来适应你的STM32型号和霍尔电机。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值