【龙印】用龙芯1c的硬件pwm产生单个脉冲来驱动步进电机

【keil5】pwm驱动直流电机 一篇简单的PWM驱动步进电机的文章 阅读详情

本文为在用龙芯1c做3D打印机过程中的笔记。龙芯1c做的3d打印机简称“龙印”,Git地址“http://git.oschina.NET/caogos/marlin_ls1c”

以步进电机驱动芯片A4988为例,给A4988一个脉冲,A4988就会驱动步进电机“走”一步(假设细分为1),在1秒内脉冲个数就决定了步进电机的速度。在marlin源码中,是通过在定时器中断里面将IO口拉高然后延时再拉低来产生一个脉冲的。很显然,通过这种延时的方式来产生脉冲会消耗大量的cpu资源,恰好龙芯1c的硬件pwm可以产生单个脉冲,这样就不必在定时器中断中延时了,大大降低了cpu占有率,当步进电机速度越快时,效果越明显。

硬件说明

龙芯1c共有4个pwm,其中pwm0和pwm1可以直接使用,pwm2和pwm3需要复用。pwm2和pwm3可以在多个引脚上复用,比如pwm2可以与CAMDATA2/GPIO52复用,也可以与CAMPCLKIN/GPIO46复用。由于智龙v2.1的板子上,CAMDATA2/GPIO52接有led,所以选择将pwm2与CAMPCLIN/GPIO46复用,pwm3类似,选择与CAMCLKOUT/GPIO47复用。

所以源码中有

// PWNn所在gpio
#define LS1C_PWM0_GPIO06                        (6)
#define LS1C_PWM1_GPIO92                        (92)
#define LS1C_PWM2_GPIO46_CAMPCLKIN              (46)    // 第四复用
#define LS1C_PWM3_GPIO47_CAMCLKOUT              (47)    // 第四复用


源码

应用程序

应用程序通过write()接口写入脉冲个数

test.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main(void)
{
    int fd = 0;
    int ret = 0;
    int pulse_num = 0;

    fd = open("/dev/ls1c_pwm_pulse", O_RDWR);
    if (-1 == fd)
    {
        printf("[%s] open device file.\n", __FUNCTION__);
        return -1;
    }

    while (1)
    {
        pulse_num = 20;
        ret = write(fd, &pulse_num, sizeof(pulse_num));
        if (sizeof(pulse_num) != ret)
        {
            close(fd);
            printf("[%s] write fail. ret=%d\n", __FUNCTION__, ret);
            return -1;
        }
        
        sleep(1);
    }
}





Makefile

HEADER_FILE = $(wildcard *.h)
SRC = $(wildcard *.c)
OBJ = $(SRC:.c=.o)
DEST = test
CC = mipsel-linux-gcc

all:$(DEST)

$(DEST):$(OBJ)
	$(CC) $^ -o $@
	cp $@ /nfsramdisk/LS1xrootfs-demo/test

$(OBJ):$(SRC) $(HEADER_FILE)
	$(CC) -c $^

clean:
	rm -f *.o $(DEST)





驱动

/*
 * drivers\misc\ls1c_pwm_pulse.c
 * 用龙芯1c的硬件pwm产生单个脉冲
 */

 
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/interrupt.h>
#include <linux/err.h>
#include <linux/miscdevice.h>
#include <linux/gpio.h>
#include <linux/delay.h>
#include <linux/signal.h>
#include <linux/sched.h>
#include <linux/fs.h>
#include <linux/time.h>
#include <linux/errno.h>
#include <linux/clk.h>
#include <linux/mutex.h>
#include <linux/kfifo.h>


enum {
    LS1C_PWM_0 = 0,
    LS1C_PWM_1 = 1,
    LS1C_PWM_2 = 2,
    LS1C_PWM_3 = 3,
};

// gpio配置寄存器
#define LS1C_GPIO_CFG0                          (0xbfd010c0)        // 控制gpio[31:0]
#define LS1C_GPIO_CFG1                          (0xbfd010c4)        // 控制gpio[63:32]
#define LS1C_GPIO_CFG2                          (0xbfd010c8
龙印】把龙芯1c的pwm用作定时器并产生中断 本文为在用龙芯1c做3D打印机过程中的笔记。龙芯1c做的3d打印机简称“龙印3d打印机固件marlin巧妙运用定时器让整个固件不必依赖实时操作系统,即把对实时性要求较高的部分巧妙的用定时器中断来实现了。marlin固件的原理分析请参考《3D打印机:FPGA+Nios_ii移植Marlin固件二:Marlin固件的详细分析》 http://blog.sina.com.cn/s/blog_67993 阅读详情

相关推荐

龙印】用龙芯1c实现3D打印机的总体思路

热熔型3d打印机的工作原理控制打印头不停的运动,在需要打印的地方将耗材融化并挤出来。就像蜘蛛织网一样,当蜘蛛的网线够大,同时网格够小,那么是不是相邻两格的网线就紧挨着了。我就是这么理解热熔型3d打印机的打印原理的。需求分解从以上原理可知,热熔型3d打印机的两个关键点1,打印头的运动(从一个点运动到另一个点)2,耗材融化至于打印头什么时候该从那个点运动到另外的那个点,有切片软件根据3d模型决定,什么

勤为本的专栏 3121

使用STM32基本定时器输出PWM脉冲控制步进电机

定时器,步进电机PWM脉冲,主从定时器,stm32

qq_43522215的博客 1万+

stm32f103zet6定时器和pwm简单驱动步进电机

正如所说简单驱动步进电机,这里使用的定时器方式是很简单的,用一个设置一个确定的定时器周期,在一个周期里面进行对步进电机的IO电平的自动翻转,这里的自动翻转是类似于LED的翻转,比如LED1=!LED1,而PWM驱动步进电机也跟我们驱动直流电机一样简单的。...

le123didi的博客 7651

STM32CubeMX(5)—— STM32利用PWM控制42步进电机

STM32 Cubemax(五) —— STM32利用PWM控制42步进电机 文章目录STM32 Cubemax(五) —— STM32利用PWM控制42步进电机前言一、硬件准备二、代码部分1.CubeMax配置2.代码编写总结 前言 42步进电机也是经常使用的一类电机,其控制方法也十分简单,但如果要用好步进电机,还需要了解一些前瞻知识,这篇文章除了介绍其控制方法外,还会介绍其中一些必备的知识。 一、硬件准备 42步进电机 42步进电机在市面上还是挺常见的,每一款都大同小异。而市面上最为常用的为两相四

lzzzzzzm的博客 2万+

stm32F103单片机pwm控制伺服驱动器进而控制步进电机

stm32利用IO口输出pwm波形控制步进电机运转;

m0_59708092的博客 8660

超简单!STM32 标准库 PWM 控制 57 步进电机(全程实操接线 + 源码)

基于STM32F103ZET6与TB6600驱动器,通过PWM实现57步进电机的启停及正反转控制。提供硬件接线、细分原理说明及完整标准库代码,支持按键交互,适合工业运动控制入门实践。

桃蹊、的博客 7558

HAL库配置STM32F1系列PWM驱动步进电机(二)

PWM主要有两大要素:频率&占空比。

Keitheasun的博客 4146

PWM驱动电机系列——PID控制 (各电机设备之间的驱动差异及区别)自动控制系统的性能指标

对于速度跟踪控制来说,增量式 PID 更加适合,因为它直接计算速度变化量。相比之下,位置式 PID 需要计算绝对速度误差,在速度跟踪控制中可能会产生超调和振荡等问题。

weixin_56228133的博客 4062

PWM步进电机控制技术详解与实战

htmltable {th, td {th {pre {简介:PWM步进电机是一种广泛应用在精确定位与速度控制中的电机控制技术。通过脉宽调制(PWM)方式,可以高效调节步进电机的转速、扭矩和位置。本文详解了步进电机的工作原理、PWM控制优势、实现方式及常见控制策略,并结合其在工业自动化、3D打印、仪器仪表等领域的应用,帮助读者全面掌握PWM步进电机的技术要点与实践方法。

weixin_42589700的博客 2105

步进电机简单使用:STM32 PWM输出固定数目的脉冲数(基于CubeMX)

本文讲解步进电机驱动原理,以及如何通过CubeMX实现快速配置PWM来输出固定数目个脉冲

weixin_46461874的博客 1万+

汽车仪表步进电机驱动

(而且我们会注意到,在这种跳变会导致磁场的方向、大小都变化)假设我们需要转子在两组线圈磁场的合力下转动到目标位置A,给两组线圈按上表中的时序加上相应电压,磁场方向跳变到位置A,则转子随着磁场跳变开始转动,当转子转到A时,会因为机械惯性超过A而继续转动到B,此时转子转动方向和磁场力的方向相反了,那么在磁场力的作用下,它又反向朝着A转动;可以设想,如果“拖动”转子转动的磁场,其方向、大小的变化是按照上图中的圆的方程变化的,而且恰好每周等分为24个位置,那么转子也就会按着圆的方程去转动。

lanxiao8888的专栏 3159

STM32用PWM驱动步进电机

注意要点:步进电机和舵机驱动是不一样的,它是根据步长来移动的,所以要开一个中断,来计算步长,具体代码,可以看看。#define STEPS_PER_REVOLUTION 200 // 每转步数 (1.8°/步)// 50% 占空比。// 初始化步进电机驱动。// 2. 配置PWM输出引脚 (PA1 - TIM2_CH2)// 3. 配置方向控制引脚 (PA2)// 5. PWM 输出配置。// 6. 配置更新中断。

jinjin_longlong的博客 1588

【Arduino步进电机】【4.1PWM控制基础

delay时间求解代码,matlab。固定单位步数,调delay时间。

RickyWasYoung的博客 2234

【Arduino步进电机】【4.0】PWM基础

简称) 是一种,最常用于控制电路。该信号在预定义的时间和速度中设置为高(如5v或3.3v)和低(0v)。通常,我们将PWM的高电平称为1,低电平为0。pwm的是指1秒钟内信号从高电平到低电平再回到高电平的次数(一个周期);也就是说一秒钟PWM有多少个周期单位: Hzpwm的T=1/f周期=1/频率如50Hz = 20ms 一个周期如果频率为50Hz ,也就是说一个周期是20ms 那么一秒钟就有 50次PWM周期是一个脉冲周期内,与的比例单位: % (0%-100%)

RickyWasYoung的博客 3473

STM32驱动步进电机(HAL库)

STM32F4系列配置HAL库驱动步进电机

m0_68300139的博客 6478

步进电机驱动器介绍 --PWM

pwm功能可以控制直流电机的速度,同时,也可以控制步进电机的步数。 1、电机驱动TB6600,建议看卖家的介绍,都会比较详细。 步进电机驱动器基本一样,以电机驱动TB6600。 首先盗图,接树莓派 步进电机驱动器_树莓派控制步进电机-TB6600-Java版本_MIa wang的博客-CSDN博客 主要分为上面框出来的几个大的模块: A.电源:按照驱动器上的标示来接,DC9~42V B.电机连接线: A+,A-,B+,B-,按照电机上的标示来接;注意:其中一组对调,电机反转。所以避免搞乱,按

weixin_40296236的博客 1万+

基于FPGA的PWM加减速控制实现

2021.09.02 最近在做直线电机的控制,是基于FPGA来实现的,简单学习了PWM控制电机的一些知识,开始尝试上手。 控制方式:开环控制;容易实现。 控制步进电机,FPGA输出控制PWM脉冲脉冲频率和脉冲数,使得电机按照一定的速度移动到目标位置。但是,在高速运动的过程中,如果没有加减速或者加减速控制不合理,电机就有可能出现失步或者过冲,表现为:猛冲、电机卡死、报错,或者运动停止后回颤,所以需要选用合适的加减速算法。 在步进电机的开......

qq_29611071的博客 3471

龙芯1c库】封装硬件pwm接口和使用示例

龙芯1c库是把龙芯1c的常用外设的常用功能封装为一个库,类似于STM32库。Git地址:https://gitee.com/caogos/OpenLoongsonLib1c 本文通过“龙芯1c库”中提供的PWM接口,实现了在4路pwm的输出连续的pwm脉冲单个脉冲。 在讲解了pwm接口之后,才开始详细介绍寄存器,以及怎样使用这些寄存器来封装接口,最后给出了封装的pwm接口代码清单。   龙芯...

勤为本的专栏 2644
上一篇: 【龙印】以程序员的角度整定3d打印机的pid实现控温
下一篇: 【龙印】用龙芯1c实现3D打印机的总体思路
勤为本
博客等级 码龄15年 215粉丝 60原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值