树莓派3b+使用得科大功率电机驱动板驱动电机,键盘控制电机(利用pwm驱动和调速)

本文详细介绍如何使用树莓派的GPIO接口通过RPi.GPIO模块控制电机,包括GPIO引脚配置、PWM信号生成及响应用户输入实现电机正反转。代码实例清晰展示初始化设置、速度控制及异常处理过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、树莓派GPIO引脚图

二、导入RPi.GPIO模块

可以用下面的代码导入RPi.GPIO模块。

import RPi.GPIO as GPIO

三、得科驱动板简介

注意

四、代码实现(machine.py)

#coding=utf-8
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)   
IN1 = 11                  
IN2 = 12                  
IN3 = 13             
IN4 = 15  

def init():
        global p1
        global p2
        global p3
        global p4
        GPIO.setup(IN1, GPIO.OUT)   #设置引脚模式
        GPIO.setup(IN2, GPIO.OUT)
        GPIO.setup(IN3, GPIO.OUT)
        GPIO.setup(IN4, GPIO.OUT)

        p1= GPIO.PWM(IN1, 100)      #设定pwm启动参数
        p2= GPIO.PWM(IN2, 100)
        p3= GPIO.PWM(IN3, 100)    
        p4= GPIO.PWM(IN4, 100)

        p1.start(0)                 #设置PWM初始值
        p2.start(0)
        p3.start(0)
        p4.start(0)

def stop():
        p1.ChangeDutyCycle(0)       #改变pwm占空比的值
        p2.ChangeDutyCycle(0)
        p3.ChangeDutyCycle(0)
        p4.ChangeDutyCycle(0)

def up():   
        p1.ChangeDutyCycle(50)
        p2.ChangeDutyCycle(0)
        p3.ChangeDutyCycle(50)
        p4.ChangeDutyCycle(0)

def down():
        p1.ChangeDutyCycle(0)
        p2.ChangeDutyCycle(50)
        p3.ChangeDutyCycle(0)
        p4.ChangeDutyCycle(50)

if __name__ == "__main__":
        try:
            init()        #初始化引脚
            time.sleep(1)
            while True:
                res = raw_input()
                print("The input value is:",res)
                if (res == "w" or res == "W"):#按w并回车确认,电机以50占空比转动                
                    up()
                    print("forward",time.ctime())                   
       
                if (res == "s" or res == "S"):#按s并回车确认,电机停止转动
                    stop()
                    print("stop",time.ctime())
        
                if (res == "d" or res == "D"):#按d并回车确认,电机以50占空比转动
                    down()
                    print("back",time.ctime())     
        except KeyboardInterrupt:                   #程序异常处理,释放所有使用到的GPIO端口
            GPIO.cleanup()
        

五、运行代码

sudo python machine.py

 

### STM32 HAL库 TIM定时器配置 PWM驱动直流电机代码示例 以下是一个基于STM32 HAL库的TIM定时器配置PWM驱动直流电机的完整代码示例。该示例适用于江大相关教程中的TB6612FNG双H桥直流电机驱动芯片[^4]。 #### 1. 定时器初始化 使用STM32CubeMX生成代码时,需配置一个定时器(例如TIM1)用于PWM输出,并设置其参数为以下值: - 模式:PWM模式1或模式2。 - 频率:根据需求设置(例如10kHz)。 - 分辨率:通过ARR(自动重载寄存器)设置。 ```c void MX_TIM1_Init(void) { TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; htim1.Instance = TIM1; htim1.Init.Prescaler = 83; // 设置预分频器,假设系统时钟为84MHz,则计数频率为1MHz htim1.Init.CounterMode = TIM_COUNTERMODE_UP; // 向上计数模式 htim1.Init.Period = 999; // 自动重装载值,PWM分辨率为1000 htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_Base_Init(&htim1); sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig); HAL_TIM_PWM_Init(&htim1); sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig); sConfigOC.OCMode = TIM_OCMODE_PWM1; // 设置为PWM模式1 sConfigOC.Pulse = 500; // 初始占空比50% sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; // 有效电平为高 sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1); // 配置通道1 HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_4); // 配置通道4 } ``` #### 2. GPIO初始化 配置GPIO端口以控制TB6612FNG芯片的输入信号: - AIN1、AIN2用于控制电机A的方向。 - BIN1、BIN2用于控制电机B的方向。 - PWMA、PWMB分别连接到TIM1的CH1CH4。 ```c void MX_GPIO_Init(void) { __HAL_RCC_GPIOA_CLK_ENABLE(); // 使能GPIOA时钟 __HAL_RCC_GPIOB_CLK_ENABLE(); // 使能GPIOB时钟 GPIO_InitTypeDef GPIO_InitStruct = {0}; // 配置AIN1 (PA8) AIN2 (PA9) 为推挽输出 GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 配置BIN1 (PB6) BIN2 (PB7) 为推挽输出 GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } ``` #### 3. 控制函数实现 编写函数以控制电机的速度方向: ```c void SetMotorSpeed(uint16_t speedA, uint16_t speedB) { if(speedA > 1000) speedA = 1000; if(speedB > 1000) speedB = 1000; __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, speedA); // 设置PWMA占空比 __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_4, speedB); // 设置PWMB占空比 } void SetMotorDirection(bool forwardA, bool forwardB) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, forwardA ? GPIO_PIN_SET : GPIO_PIN_RESET); // AIN1 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, forwardA ? GPIO_PIN_RESET : GPIO_PIN_SET); // AIN2 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, forwardB ? GPIO_PIN_SET : GPIO_PIN_RESET); // BIN1 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, forwardB ? GPIO_PIN_RESET : GPIO_PIN_SET); // BIN2 } ``` #### 4. 主函数调用 在主函数中调用上述函数以控制电机运行: ```c int main(void) { HAL_Init(); MX_GPIO_Init(); MX_TIM1_Init(); HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); // 启动PWMA HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4); // 启动PWMB SetMotorSpeed(500, 500); // 设置电机速度为50% SetMotorDirection(true, true); // 设置电机AB正转 while (1) { // 主循环 } } ``` ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值