Elfboard-ELF开发板 Linux学习笔记(四)—— 应用编程篇

Elfboard-ELF开发板 Linux学习笔记(四)—— 应用编程篇 点亮LED

一、SYSFS文件系统介绍

在 Linux 系统下,一切皆文件,sysfs 是一个基于内存的文件系统,被称为虚拟文件系统,它对系统设备进行管理,产生一个包含所有系统硬件层次的视图,同时将内核信息以文件的方式提供给应用层使用。

sysfs 文件系统把连接在系统上的设备和总线组织成为一个分级的文件、展示设备驱动模型中各组件的层次关系。sysfs 提供了一种机制,可以显式的描述内核对象、对象属性及对象间关系,用来导出内核对象(kernel object,譬如一个硬件设备)的数据、属性到用户空间,以文件目录结构的形式为用户空间提供对这些数据、属性的访问支持。

sysfs 文件系统挂载在/sys 目录下

这里给大家进行一个总结,应用层想要对底层硬件进行操控,通常可以通过两种方式:

  • /dev/目录下的设备文件(设备节点);
  • /sys/目录下设备的属性文件。

具体使用哪种方式需要根据不同功能类型设备进行选择,有些设备只能通过设备节点进行操控,而有些设备只能通过 sysfs 方式进行操控;当然跟设备驱动具体的实现方式有关,通常情况下,一般简单地设备会使用 sysfs 方式操控,其设备驱动在实现时会将设备的一些属性导出到用户空间 sysfs 文件系统,以属性文件的形式为用户空间提供对这些数据、属性的访问支持,譬如 LED、GPIO 等。
但对于一些较复杂的设备通常会使用设备节点的方式,譬如 LCD 等、触摸屏、摄像头等。

二、LED控制方式

1.进入led设备目录

在这里插入图片描述

2.查看该目录下个文件的作用

  • brightness:翻译过来就是亮度的意思,该属性文件可读可写;所以这个属性文件是用于设置 LED的亮度等级或者获取当前 LED 的亮度等级,譬如 brightness 等于 0 表示 LED 灭,brightness 为正整数表示 LED 亮,其值越大、LED 越亮
  • max_brightness:该属性文件只能被读取,不能写,用于获取 LED 设备的最大亮度等级。
  • trigger:触发模式,该属性文件可读可写,读表示获取 LED 当前的触发模式,写表示设置 LED 的
    触发模式。不同的触发模式其触发条件不同,LED 设备会根据不同的触发条件自动控制其亮、灭状态,通过 cat 命令查看该属性文件,可获取 LED 支持的所有触发模式以及 LED 当前被设置的触发模式
    在这里插入图片描述
    使用cat命令可以查看该属性文件。

三、编写LED应用程序

控制led3、led4每隔0.5秒亮灭一次

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#define LED1_BRIGHTNESS     "/sys/class/leds/led1/brightness"
#define LED2_BRIGHTNESS     "/sys/class/leds/led2/brightness"
#define LED3_BRIGHTNESS     "/sys/class/leds/led3/brightness"
#define LED4_BRIGHTNESS     "/sys/class/leds/led4/brightness"
int main()
{
    int on=1;
    int led;
    int fd1,fd2,fd3,fd4;
    fd1=open(LED1_BRIGHTNESS, O_WRONLY);
    fd2=open(LED2_BRIGHTNESS, O_WRONLY);
    fd3=open(LED3_BRIGHTNESS, O_WRONLY);
    fd4=open(LED4_BRIGHTNESS, O_WRONLY);
    if(fd1<0)
    {
        perror("open device led1");
        exit(1);
    }
    if(fd2<0)
    {
        perror("open device led2");
        exit(1);
    }    
    if(fd3<0)
    {
        perror("open device led3");
        exit(1);
    }
    if(fd4<0)
    {
        perror("open device led4");
        exit(1);
    }
    printf("leds test show,press ctrl+c to exit \n");
    while(1)
    {
        write(fd3, "1", 1);
        write(fd4, "1", 1);
        usleep(500000);
        write(fd3, "0", 1);
        write(fd4, "0", 1);
        usleep(500000);
    }
    close(fd1);
    close(fd2);
    close(fd3);
    close(fd4);
    return 0;
}

四、Ubuntu交叉编译工具编译

  • 将写好的.c文件上传的Ubuntu中
  • 设置交叉编译的环境变量
. /opt/fsl-imx-x11/4.1.15-2.0.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
  • 查看环境变量
echo $CC
  • 使用交叉编译工具编译你上传的文件
$CC led.c -o led

五、开发板上进行测试

  • 上传你编译好的文件到开发板中
scp led root@192.168.0.232:/home/root
  • 执行程序
./led

实验现象:
两个LED灯在同时闪烁

<think>好的,用户想用ELF2开发板控制直流电机,需要相关的教程、示例代码和硬件连接信息。首先,我需要确认ELF2开发板的具体型号和功能,是否有相关的官方文档或者社区支持。根据提供的引用,用户之前可能接触过BLDC电机控制,比如esp_sensorless_bldc_control方案和MCSPTE1AK344套件,但这次是直流电机,可能需要不同的控制方法。 直流电机通常使用PWM信号控制速度,方向则需要H桥电路。所以硬件连接部分可能需要电机驱动模块如L298N或TB6612,ELF2的GPIO输出PWM,同时控制方向引脚。软件方面需要配置PWM模块,编写控制逻辑。 用户提到的ELF2开发板,可能基于某个微控制器,比如ESP32或者STM32,需要确定具体型号以查找对应的库和示例代码。假设ELF2使用ESP32,那么可以使用Arduino IDE或ESP-IDF来开发。示例代码可能包括设置PWM参数,控制GPIO高低电平来改变电机方向。 另外,需要确保用户了解安全措施,比如添加保护二极管、避免电源反接、使用独立电源为电机供电,防止电流倒灌损坏开发板。还可能涉及电流检测和过流保护,但基础控制可能不需要这些。 用户可能需要基础教程,所以步骤需要详细,从硬件连接到代码编写,再到测试。可能的问题包括电机不转、转速不稳定,需要排查电路连接和代码配置。 最后,生成相关问题,帮助用户深入,比如如何调速、控制多个电机、加入传感器反馈等。确保回答结构清晰,分步骤说明,引用相关参考资料,但根据用户提供的引用,可能没有直接相关的,所以主要依赖通用知识和假设ELF2的功能。</think>### ELF2开发板控制直流电机技术指南 ### 一、硬件连接 1. **核心组件** - ELF2开发板 - 直流电机(额定电压需匹配开发板输出) - 电机驱动模块(推荐L298N或TB6612FNG H桥驱动) - 外部独立电源(建议电压与电机额定电压一致) 2. **接线步骤** ```text ELF2 GPIO口 → 驱动模块控制端 │ │ PWM引脚 → 驱动模块ENA/ENB(速度控制) │方向引脚 → 驱动模块IN1/IN2(正反转控制) │ └─驱动模块输出端 → 直流电机两极 ``` > 注意:电机电源必须与开发板电源隔离,建议使用独立供电方案 ### 二、软件配置 1. **开发环境** - 推荐使用Arduino IDE或PlatformIO - 安装对应硬件支持包(如ESP32开发包) 2. **基础控制代码示例** ```cpp // 引脚定义 #define MOTOR_PWM GPIO_NUM_12 #define MOTOR_IN1 GPIO_NUM_14 #define MOTOR_IN2 GPIO_NUM_27 // PWM参数配置 const int freq = 5000; const int resolution = 8; void setup() { // 初始化GPIO pinMode(MOTOR_IN1, OUTPUT); pinMode(MOTOR_IN2, OUTPUT); // 配置PWM通道 ledcSetup(0, freq, resolution); ledcAttachPin(MOTOR_PWM, 0); } void setMotor(int speed, bool direction) { digitalWrite(MOTOR_IN1, direction); digitalWrite(MOTOR_IN2, !direction); ledcWrite(0, abs(speed)); // 速度范围0-255 } void loop() { // 正向50%转速 setMotor(128, true); delay(2000); // 停止 setMotor(0, true); delay(1000); // 反向75%转速 setMotor(191, false); delay(2000); } ``` ### 三、进阶功能实现 1. **闭环控制** - 集成编码器反馈: ```cpp // 编码器脉冲计数 volatile long encoderCount = 0; void IRAM_ATTR encoderISR() { encoderCount++; } ``` - PID调速算法: $$u(t) = K_p e(t) + K_i \int_0^t e(\tau)d\tau + K_d \frac{de(t)}{dt}$$ 2. **保护机制** - 过流检测:通过ADC采样电流传感器信号 - 软件限流:限制PWM占空比最大值 - 温度监控:读取板载温度传感器数据 ### 、关键参数配置表 | 参数项 | 推荐值 | 作用说明 | |----------------|-------------|-----------------------| | PWM频率 | 5-20kHz | 平衡噪声与效率 | | 死区时间 | 1-2μs | 防止H桥直通短路 | | 采样周期 | 10ms | 闭环控制更新频率 | | 最大占空比 | 80% | 电机安全运行范围 | ### 五、调试技巧 1. **基础验证步骤** - 先测试GPIO电平输出是否正常 - 用万用表验证PWM波形 - 空载测试电机响应 2. **常见问题处理** - 电机抖动:检查电源功率是否充足 - 转速不稳:增加滤波电容(推荐100-470μF) - 方向异常:检查IN1/IN2逻辑组合
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

君逸~~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值