rk3288模拟可调占空比pwm波形

一、内核为高精度定时器重新设计了一套软件架构,它可以为我们提供纳秒级的定时精度,以满足对精确时间有迫切需求的应用程序或内核驱动,以下学习使用hrtimer(high resolution timer)高精度定时器。
二、hrtimer_init函数初始化定时器工作模式。which_clock可以是CLOCK_REALTIME、CLOCK_MONOTONIC、CLOCK_BOOTTIME中的一种,mode则可以是相对时间HRTIMER_MODE_REL,也可以是绝对时间HRTIMER_MODE_ABS。
void hrtimer_init(struct hrtimer *timer, clockid_t which_clock,
enum hrtimer_mode mode);

三、设定超时回调函数。
timer.function = hr_callback;

四、使用hrtimer_start激活该定时器。根据time和mode参数的值计算hrtimer的超时时间,并设置到timer->expire域。 expire设置的是绝对时间,所以如果参数mode的值为HRTIMER_MODE_REL(即参数tim的值为相对时间),那么需要将tim的值修正为绝对时间:expire = tim + timer->base->get_time(),调用enqueue_hrtimer,将hrtimer加入到红黑树中。
int hrtimer_start(struct hrtimer *timer, ktime_t tim,
const enum hrtimer_mode mode);

五、使用hrtimer_cancel取消一个hrtimer。
int hrtimer_cancel(struct hrtimer *timer);

六、定时器一旦到期,function字段指定的回调函数会被调用,该函数的返回值为一个枚举值,它决定了该hrtimer是否需要被重新激活。
enum hrtimer_restart {
HRTIMER_NORESTART, /* Timer is not restarted /
HRTIMER_RESTART, /
Timer must be restarted */
};

七、把hrtimer的到期时间推进一个tick周期,返回HRTIMER_RESTART表明该hrtimer需要再次启动,以便产生下一个tick事件。
hrtimer_forward(timer, now, tick_period);
return HRTIMER_RESTART;

示例为模拟pwm波

形控制占空比调节风扇的速度

/*
 * linux/drivers/video/backlight/dc_fan.c
 * direct current fan driver
 */
	
#include <linux/kernel.h>
#include <linux/gpio.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/of_platform.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/sched.h>
#include <linux/pm.h>
#include <linux/sysctl.h>
#include <linux/proc_fs.h>
#include <linux/platform_device.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <linux/delay.h>
#include <linux/hrtimer.h>
#include <linux/jiffies.h>
#include <linux/miscdevice.h>

#define GPIO_HIGH	1
#define	GPIO_LOW	0

int FAN_OUT_GPIO;
int FAN_EN_GPIO;

int fan_freq=1000;	//1000-1Khz
int duty_cycle=40;
int temp;
static struct hrtimer dc_timer;
ktime_t kt;

ssize_t dcfan_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
{
   
	int ret;
	char *data;
	char *first,*second;
	
	printk(KERN_EMERG "%s,line:%d\n",__FUNCTION__,__LINE__);
	
	if(!copy_from_user(
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一份汇编代码示例,但需要先了解一些基础知识。 首先,PWM(脉冲宽度调制)波是一种周期性的数字信号,在单片机中可以使用定时器/计数器来产生。占空比是高电平与周期之比,可以通过设置定时器计数值和比较值来控制。 在51单片机中,有两个定时器/计数器,分别为Timer0和Timer1。以下是一个使用Timer0产生可调占空比PWM波的汇编代码示例: ``` ; 定义端口和常量 PWM_PORT equ P1 ; PWM输出端口 PWM_FREQ equ 100 ; PWM频率为100Hz PWM_DUTY equ 50 ; PWM占空比为50% ; 初始化Timer0 MOV TMOD, #0 ; 定时器模式,使用模式1 MOV TH0, #0 ; 定时器初值为0 MOV TL0, #0 ; 定时器初值为0 ; 计算定时器计数值和比较值 MOV A, #256 ; Timer0为8位计数器,最大计数值为256 MOV B, #((10000/PWM_FREQ)/256) ; 计算定时器计数值 MOV R1, #((PWM_DUTY*256)/100) ; 计算占空比对应的比较值 ; 开始产生PWMPWM_LOOP: SETB PWM_PORT ; 设置PWM输出端口为高电平 MOV TH0, B ; 设置定时器计数值 MOV TL0, #0 ; 定时器初值为0 SETB TR0 ; 启动Timer0 DJNZ R1, $ ; 比较值不为0时继续输出高电平 CLR TR0 ; 停止Timer0 CLR PWM_PORT ; 设置PWM输出端口为低电平 MOV TH0, A ; 设置定时器计数值 MOV TL0, #0 ; 定时器初值为0 SETB TR0 ; 启动Timer0 DJNZ R1, PWM_LOOP ; 比较值不为0时继续输出低电平 CLR TR0 ; 停止Timer0 SJMP PWM_LOOP ; 循环输出PWM波 ``` 在上述代码中,通过设置Timer0的计数值和比较值,实现了产生可调占空比PWM波。其中,变量B表示定时器计数值,变量R1表示占空比对应的比较值,通过循环输出高电平和低电平来实现PWM波的产生。 需要注意的是,上述代码中的PWM输出端口为P1口,您需要根据实际硬件连接情况进行修改。另外,由于Timer0的计数值和比较值的设置与PWM频率和占空比有关,需要根据实际要求进行计算和调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值