linux IO 模拟 PWM 有时间间隔 问题
static void vibe_work_func(struct work_struct *work) //DO-->工作队列函数
{
static int turn_flag;
unsigned long flags;
while(hrtimer_cancel(&vibe_timer))//定时器取消
{
printk("[pwm] pwm_off: try to cancel hrtimer \n");
}
SPIn_lock_irqsave(&pwm_spinlock, flags);//2013-7-10
if(turn_flag == 0)
{
turn_flag = 1;
mt_set_GPIO_out(gpio_LCD_backlight_3d1_en,1);
mt_set_gpio_out(gpio_lcd_backlight_3d2_en,0);
}
else if(turn_flag == 1)
{
turn_flag = 0;
mt_set_gpio_out(gpio_lcd_backlight_3d1_en,0);
mt_set_gpio_out(gpio_lcd_backlight_3d2_en,1);
}
printk("'vibe_work_func'-->work\n");
// msleep(50); /* CPU sleep */
if(pwm_open_flag==1){
vibe_timer.function = vibrator_timer_func;
hrtimer_start(&vibe_timer,
ktime_set(value / 1000, (value % 1000) * 1000000),HRTIMER_MODE_REL);
}
spin_unlock_irqrestore(&pwm_spinlock, flags);
}
硬件决定了 无法用硬件的PWM口发生信号。
波形如 图片所示,请高手分析下 是什么原因?有什么办法 可以让IO口产生连续的波形,

因为系统有其它的任务在跑,所以会出现有时出现时间变长的问题。
所以你要保证你这个东西是不会让别的东西打断。
所以加了 自旋锁 spin_lock_irqsave,但没效果,很奇诡,自旋锁不是可以独占CPU么?
关键在你的定时器,他的定时时间因为任务切换时,去调用这个函数时不有延时。
不能开定时器,定时器依赖系统调度
我就觉得LINUX系统是不能做摸拟PWM的。
让你们硬件改用一线脉冲控制背光吧
jianghuiyan
我就觉得LINUX系统是不能做摸拟PWM的。
其实别的RTOS也一样,想用GPIO来做精确的脉宽是做不到的,我倒觉得定时器是准确的,但在GPIO操作的时候不精确了。
因为他的定时器时间到后,他也是相当一个任务调度的。
有任务调度,哪么就不可能做到100%保证立马执行到。
硬件PWM都是硬件定时器的,多任务操作系统软件定时器不准的,依赖系统调度算法,并不是时钟中断来后马上处理的。所以不可能做到精确
把PWM周期加长,减少间隔所占的比重。比如20ms以上。
这样影响变小,但还有,频率变eq低,估计就实去他芯片的要求了。
BL芯片有接受较低频率PWM信号的,以前我用过。不知小编用的芯片是什么。
不明白~ 频率 eq ?
不知道是什么芯片,3D显示屏需要PWM信号控制
eq 是我打字快了,打上去的。
一线脉冲 是指什么 ?
linux 应该定时器产生的软终端吧,在这个中断里面改变IO口电平是不是实时性比较好 ~
相对应当要好很多,但是具体还是用示波器测试看看。
linux 应该定时器产生的软终端吧,在这个中断里面改变IO口电平是不是实时性比较好 ~
定时器 也依赖与任务调度么? 定时器 不是对 clock tick 进行计数的么~
频率 需要 60HZ以上啊 ~
依赖的,tick到了只是唤醒定时器等待的任务,具体什么时候CPU会执行,未知
