PWM配置智能小车电机-让小车动起来

本文详细介绍了在嵌入式系统中如何进行硬件电路连接,包括使用PWM和GPIO控制电机的初始化、开始、停止以及设置速度的过程。着重展示了MOTOR初始化函数,以及如何通过方向控制实现电机的启动和停止功能。

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


一、硬件电路

PC6为左前电机的PWM输入,为电机提供动力。
PG7、PG8控制左前电机的方向。
在这里插入图片描述
在这里插入图片描述

二、MOTOR初始化

给电机提供周期为1000000ns的PWM波形

static int MotorInit(struct Motor *ptdev){
	if(NULL == ptdev){
		LogDebug("MotorStart EINVAL\r\n");
		return -EINVAL;
	}

    Pwm_s MotorPwm;
	switch(ptdev->channel){
        case 1:
            MotorPwm = LFMotorPwm;
            break;  
        case 2:
            MotorPwm = RFMotorPwm;
            break;
        case 3:
            MotorPwm = LBMotorPwm;
            break;
        case 4:
            MotorPwm = RBMotorPwm;
            break; 
        default:
            return -EINVAL;
    }
    
	int ret = MotorPwm.Config(&MotorPwm,SET_PERIOD_VALUE,1000000);
	if(ret != ESUCCESS){
		LogDebug("MotorPwm.Config failed\r\n");
		return -EIO;
	}

	
	ret = MotorPwm.Start(&MotorPwm);

	if(ret != ESUCCESS){
		LogDebug("MotorPwm.Start failed\r\n");
		return -EIO;
	}
	
	ret = MotorStop(ptdev);
	if(ret != ESUCCESS){
		LogDebug("MotorStop failed\r\n");
		return -EIO;
	}
	
	ret = MotorSetDir(ptdev,Motor_CR);
	if(ret != ESUCCESS){
		LogDebug("MotorSetDir failed\r\n");
		return -EIO;
	}
	
	return ESUCCESS;
}

三、MOTOR的开始与停止

通过方向控制来开始和停止电机

static int MotorStart(struct Motor *ptdev){
	if(NULL == ptdev){
		LogDebug("MotorStart EINVAL\r\n");
		return -EINVAL;
	}
    
	Gpio_s MotorCR,MotorCCR;
    switch(ptdev->channel){
        case 1:
            MotorCR = LFMotorCR;
            MotorCCR = LFMotorCCR;
            break;  
        case 2:
            MotorCR = RFMotorCR;
            MotorCCR = RFMotorCCR;
            break;
        case 3:
			MotorCR = LBMotorCR;
            MotorCCR = LBMotorCCR;
            break;
        case 4:
            MotorCR = RBMotorCR;
            MotorCCR = RBMotorCCR;
            break; 
    }

	MotorCR.Write(&MotorCR,ptdev->dir);
	MotorCCR.Write(&MotorCCR,!ptdev->dir);
	ptdev->status = Motor_Start;
	return ESUCCESS;
}

static int MotorStop(struct Motor *ptdev){
	if(NULL == ptdev){
		LogDebug("MotorStart EINVAL\r\n");
		return -EINVAL;
	}
	
	Gpio_s MotorCR,MotorCCR;
    switch(ptdev->channel){
        case 1:
            MotorCR = LFMotorCR;
            MotorCCR = LFMotorCCR;
            break;  
        case 2:
            MotorCR = RFMotorCR;
            MotorCCR = RFMotorCCR;
            break;
        case 3:
			MotorCR = LBMotorCR;
            MotorCCR = LBMotorCCR;
            break;
        case 4:
            MotorCR = RBMotorCR;
            MotorCCR = RBMotorCCR;
            break; 
    }

	MotorCR.Write(&MotorCR,ptdev->dir);
	MotorCCR.Write(&MotorCCR,ptdev->dir);
	
	ptdev->status = Motor_Stop;
	return ESUCCESS;
}

四、MOTOR设置速度

static int MotorSetSpeed(struct Motor *ptdev,uint8_t speed){
	if(NULL == ptdev){
		LogDebug("MotorStart EINVAL\r\n");
		return -EINVAL;
	}
	if(0 == speed){
		return MotorStop(ptdev);
		}

	int pulse = speed * 1000000 / 100;
	
	Pwm_s MotorPwm;
    switch(ptdev->channel){
        case 1:
            MotorPwm = LFMotorPwm;
            break;  
        case 2:
            MotorPwm = RFMotorPwm;
            break;
        case 3:
            MotorPwm = LBMotorPwm;
            break;
        case 4:
            MotorPwm = RBMotorPwm;
            break; 
        default:
            return -EINVAL;
    }
	
	int ret = MotorPwm.Config(&MotorPwm,SET_COMPARE_VALUE,pulse);
	if(ret != ESUCCESS){
		LogDebug("MotorPwm.Config failed\r\n");
		return -EIO;
	}

	if(ptdev->status != Motor_Start){
		return MotorStart(ptdev);
		}
	return ESUCCESS;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

葛霸霸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值