嵌入式爱好者

查看: 465|回复: 1

[Android] T507 PWM最低频率限制?

[复制链接]

2

主题

2

帖子

14

积分

A40i/T3/T507/T527通行证RK3568通行证RK3588通行证RK3562通行证

扫一扫,手机访问本帖
发表于 2025-1-7 19:22:58 | 显示全部楼层 |阅读模式
将Uart5的管教改为PWM输出,配置输出为PWM2

实际测试时发现,频率设置< 200Hz时,默认只能输出200Hz

最大设置到500MHz都没问题

为什么最低只能输出200Hz?是硬件限制吗?还是软件限制?
回复

使用道具 举报

0

主题

11

帖子

64

积分

发表于 2025-1-20 08:51:53 | 显示全部楼层
经过核实,T507 PWM频率计算有些问题,您参考这个修改内容进行一下修改即可
From 12f0152db36d8a620d513f48c49e4460ca931f12 Mon Sep 17 00:00:00 2001
From: houjianlin <houjianlin0802@163.com>
Date: Wed, 8 Jan 2025 15:56:26 +0800
Subject: [PATCH] fixed pwm

---
linux-4.9/drivers/pwm/pwm-sunxi-new.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
mode change 100644 => 100755 linux-4.9/drivers/pwm/pwm-sunxi-new.c

diff --git a/linux-4.9/drivers/pwm/pwm-sunxi-new.c b/linux-4.9/drivers/pwm/pwm-sunxi-new.c
old mode 100644
new mode 100755
index e9ad016b5..600cd4e2d
--- a/linux-4.9/drivers/pwm/pwm-sunxi-new.c
+++ b/linux-4.9/drivers/pwm/pwm-sunxi-new.c
@@ -305,6 +305,7 @@ static int sunxi_pwm_config_single(struct pwm_chip *chip, struct pwm_device *pwm
        unsigned int temp;
        unsigned long long c = 0;
        unsigned long entire_cycles = 256, active_cycles = 192;
+        unsigned long entire_cycles_tmp = 0;
        struct sunxi_pwm_chip *pc = to_sunxi_pwm_chip(chip);
        unsigned int reg_offset, reg_shift, reg_width;
        unsigned int reg_bypass_shift;
@@ -385,11 +386,13 @@ static int sunxi_pwm_config_single(struct pwm_chip *chip, struct pwm_device *pwm
        do_div(c, 1000000000);
        entire_cycles = (unsigned long)c;

+        entire_cycles_tmp = entire_cycles;
+
        for (pre_scal_id = 0; pre_scal_id < 9; pre_scal_id++) {
                if (entire_cycles <= 65536)
                                break;
                for (prescale = 0; prescale < PRESCALE_MAX+1; prescale++) {
-                        entire_cycles = (entire_cycles/pre_scal[pre_scal_id][1])/(prescale + 1);
+                        entire_cycles = (entire_cycles_tmp/pre_scal[pre_scal_id][1])/(prescale + 1);
                        if (entire_cycles <= 65536) {
                                div_m = pre_scal[pre_scal_id][0];
                                break;
--
2.17.1
点评回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )

GMT+8, 2025-3-26 14:19

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表