驱动LED实验

myled.h

#ifndef __MYLED_H__
#define __MYLED_H__

#define PHY_RCC_GPIO  0x5000a28
#define PHY_GPIOE_MODER 0x50006000
#define PHY_GPIOE_ODR 0x50006014

#endif

myled.c 

 

#include "myled.h"
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/uaccess.h>
#include <linux/io.h>
#define CNAME "myled"

int major;
char kbuf[128] = { 0 };
unsigned int* rcc_gpio;
unsigned int* gpioe_moder;
unsigned int* gpioe_odr;

int myled_open(struct inode* inode, struct file* file)
{
    printk("%s:%s:%d\n", __FILE__, __func__, __LINE__);
    //地址映射
    rcc_gpio = ioremap(PHY_RCC_GPIO, 4);
    if (rcc_gpio == NULL) {
        printk("ioremap rcc error\n");
        return -ENOMEM;
    }
    gpioe_moder = ioremap(PHY_GPIOE_MODER, 4);
    if (gpioe_moder == NULL) {
        printk("ioremap moder error\n");
        return -ENOMEM;
    }
    gpioe_odr = ioremap(PHY_GPIOE_ODR, 4);
    if (gpioe_odr == NULL) {
        printk("ioremap odr error\n");
        return -ENOMEM;
    }
    //寄存器的初始化
    *rcc_gpio |= (1 << 4); // gpioe时钟使能
    *gpioe_moder &= ~(3 << 20); //清零moder 21-20bit
    *gpioe_moder |= (1 << 20); //设置gpioe10为输出
    *gpioe_odr &= ~(1 << 10); // LED1灭

    return 0;
}
ssize_t myled_read(struct file* file,
    char __user* ubuf, size_t size, loff_t* offs)
{
    int ret;
    printk("%s:%s:%d\n", __FILE__, __func__, __LINE__);
    if (size > sizeof(kbuf))
        size = sizeof(kbuf);
    ret = copy_to_user(ubuf, kbuf, size);
    if (ret) {
        printk("copy data to user error\n");
        return -EIO;
    }
    return size;
}
ssize_t myled_write(struct file* file,
    const char __user* ubuf, size_t size, loff_t* offs)
{
    int ret;
    printk("%s:%s:%d\n", __FILE__, __func__, __LINE__);
    if (size > sizeof(kbuf))
        size = sizeof(kbuf);
    ret = copy_from_user(kbuf, ubuf, size);
    if (ret) {
        printk("copy data form user error\n");
        return -EIO;
    }

    //根据kbuf[0], 1灯亮 ,0 灯灭
    kbuf[0] == 1 ? (*gpioe_odr |= (1 << 10)) : (*gpioe_odr &= ~(1 << 10));

    return size;
}
int myled_close(struct inode* inode, struct file* file)
{
    printk("%s:%s:%d\n", __FILE__, __func__, __LINE__);
    iounmap(rcc_gpio);
    iounmap(gpioe_moder);
    iounmap(gpioe_odr);
    return 0;
}
const struct file_operations fops = {
    .open = myled_open,
    .read = myled_read,
    .write = myled_write,
    .release = myled_close,
};
static int __init myled_init(void)
{
    // 1.注册字符设备驱动
    major = register_chrdev(0, CNAME, &fops);
    if (major < 0) {
        printk("register char device driver error\n");
        return major;
    }
    printk("create cdev success major = %d\n", major);
    return 0;
}
static void __exit myled_exit(void)
{
    // 2.注销字符设备驱动
    unregister_chrdev(major, CNAME);
}
module_init(myled_init);
module_exit(myled_exit);
MODULE_LICENSE("GPL");

 Makefile

arch ?=arm
modname ?=demo

ifeq ($(arch),arm)
KERNELDIR := /lib/modules/$(shell uname -r)/build/
else
KERNELDIR := /home/ubuntu/FSMP1A/linux-stm32mp-5.10.61-stm32mp-r2-r0/linux-5.10.61
endif
PWD:=$(shell pwd)

all:
	make -C $(KERNELDIR) M=$(PWD) modules

clean:
	make -C $(KERNELDIR) M=$(PWD)  clean

obj-m :=$(modname).o

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 线性恒流LED调光驱动电路设计实验是一种实验方法,旨在通过设计一个线性恒流电路来实现对LED灯的调光控制。 在LED调光过程中,线性恒流驱动电路能够提供恒定的电流给LED,从而保证LED的亮度稳定,避免因电流波动引起的亮度变化。该电路的设计需要考虑到输入电压范围、输出电流范围和调光范围等因素。 在实验中,首先需要选择合适的电源电压和电流,以供给线性调光电路。其次,将LED与电路连接,使电流能够流通至LED。为了实现调光功能,可以在电路中加入一个可调的电阻或变阻器,通过改变电阻的阻值来调节电流。 在实验中,可以通过测量LED的亮度和输入电流的大小,来评估线性恒流LED调光驱动电路的性能。实验过程中,可以逐步变化电源电压和电阻的阻值,观察LED的亮度变化情况。 实验结果可以得出线性恒流LED调光驱动电路的特性曲线,即输入电流与LED亮度的关系曲线。根据实验结果,我们可以评估电路的调光性能,并针对实际应用需求进行调整和改进。 通过线性恒流LED调光驱动电路实验的设计与实施,我们可以更好地理解恒流驱动电路的工作原理,以及调光控制的基本原理。这对于LED照明的应用和研究具有重要的参考意义。 ### 回答2: 线性恒流LED调光驱动电路设计实验是一种用于控制LED亮度的实验。线性恒流驱动电路能够通过改变电流来调节LED的亮度,保证LED的工作电流恒定,从而确保LED的工作稳定性和寿命。 在设计实验中,首先需要选择合适的线性恒流驱动芯片。驱动芯片通过测量LED上的电压降来实时调节电流,控制LED的亮度。接下来,需要设计电路来连接驱动芯片和LED。这个电路需要根据驱动芯片的引脚定义和要求进行布线,并加入适当的电阻、电容和滤波器来提高电路的稳定性和效果。 在实验中,我们可以通过改变输入信号的电压和频率来调节LED的亮度。通过调整输入电压和频率,可以改变驱动电路中的电流,从而使LED的亮度随之改变。此外,还可以利用PWM(脉冲宽度调制)技术来控制LED的亮度。PWM技术通过调整脉冲信号的占空比来控制驱动电路中的电流,从而实现LED的亮度调节。 线性恒流LED调光驱动电路设计实验可以帮助我们了解LED的电流变化对亮度的影响,并且锻炼我们的电路设计和调试能力。通过实验,可以得到LED的亮度与电流、输入信号的关系,并进一步优化电路设计,实现更精确的亮度控制。同时,还可以在实验中尝试不同的驱动芯片和电路布局,以及优化LED的散热设计,从而提高LED的工作效果和寿命。 ### 回答3: 线性恒流LED调光驱动电路设计实验是指设计一种能够恒流驱动LED并实现调光功能的电路。恒流驱动电路可以保证LED的电流恒定,从而提高LED的工作效果和寿命,而调光功能则能够实现根据需要调整LED的亮度。 首先,我们需要选择合适的LED,了解其额定工作电流和电压。根据LED的工作特性和实验要求,选择合适的驱动芯片和电路元件。 其次,设计线性恒流驱动电路。线性恒流驱动电路通常由电流源和电流控制部分组成。电流源可以采用基于电流源晶体管的或基于运算放大器的设计。电流控制部分可以采用电阻、电容和运算放大器等元件组成的反馈回路进行控制。 然后,设计调光功能。调光功能可以通过改变电流源的工作状态来实现。常见的调光方法有PWM调光和线性调光。PWM调光通过控制LED的通断时间比来实现调光,而线性调光则通过改变电源电压或电流大小来实现调光。 最后,进行电路实验验证。实验过程中可以通过测量LED的亮度和电流来判断驱动电路的效果。根据实际需求,可以调整电路参数来优化驱动效果。 总之,线性恒流LED调光驱动电路设计实验是一个涉及LED基本特性、电路设计和实验验证的综合性实验。通过设计合适的电路,能够实现对LED的恒流驱动和调光功能,提高LED的使用效果和可靠性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值