平台:全志R16 Android4.4
内核:Linux3.4
概述:需要在底层使用pwm1进行IR模拟通信,发现pwm输出频率不正常

解决思路

一、调整周期和占空比

将pwm周期设为1ms,占空比为50%

 pwm_period_ns = 1000000;pwm_duty_ns = pwm_period_ns/2;    pwm_config(ir_remote_pwm_dev, pwm_duty_ns, pwm_period_ns);

通过示波器测量发现频率有变化,说明pwm1是受控的,但周期放大了120倍。

二、通过读取寄存器查看当前pwm的状态

根据User_Manual我们可以找的pwm的基地址为0x01c21400

root@astar-evb30:/sys/class/sunxi_dump # echo 0x01c21400 > dump;cat dump
echo 0x01c21400 > dump;cat dump
0x0028005f      //第15-18位为000,为120分频
root@astar-evb30:/sys/class/sunxi_dump # echo 0x01c21408 > dump;cat dump
echo 0x01c21408 > dump;cat dump
0x5dbf2ee0      //高16位为周期,低16位为active时间

具体时钟看高16位0x5dbf换算10进制位23,999
clk=24Mhz/(23,999+1) = 1,000
T=1/clk=1ms
结果很明显要么是在T=1ms时需要使用120分频,但数据未进行相应的转换,要么就是不需要使用分频时使用了分频。

三、查看代码

linux-3.4\drivers\pwm\pwm-sunxi.c

static int sunxi_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,int duty_ns, int period_ns)
{#elif defined(CONFIG_ARCH_SUN8IW3P1) || defined(CONFIG_ARCH_SUN8IW5P1)__u32 pre_scal[11][2] = {{15, 1}, {0, 120}, {1, 180}, {2, 240}, {3, 360}, {4, 480}, {8, 12000}, {9, 24000}, {10, 36000}, {11, 48000}, {12, 72000}};__u32 freq;__u32 pre_scal_id = 0;__u32 entire_cycles = 256;__u32 active_cycles = 192;__u32 entire_cycles_max = 65536;__u32 temp;if(period_ns < 10667)freq = 93747;else if(period_ns > 1000000000)freq = 1;elsefreq = 1000000000 / period_ns;entire_cycles = 24000000 / freq / pre_scal[pre_scal_id][1];printk("PWM _TEST: entire_cycles=%d\n",entire_cycles);while(entire_cycles > entire_cycles_max) {pre_scal_id++;if(pre_scal_id > 10)break;entire_cycles = 24000000 / freq / pre_scal[pre_scal_id][1];printk("PWM _TEST: entire_cycles=%d\n",entire_cycles);}if(period_ns < 5*100*1000)active_cycles = (duty_ns * entire_cycles + (period_ns/2)) /period_ns;else if(period_ns >= 5*100*1000 && period_ns < 6553500)active_cycles = ((duty_ns / 100) * entire_cycles + (period_ns /2 / 100)) / (period_ns/100);elseactive_cycles = ((duty_ns / 10000) * entire_cycles + (period_ns /2 / 10000)) / (period_ns/10000);temp = sunxi_pwm_read_reg(0);if(pwm->pwm == 0)temp = (temp & 0xfffffff0) |pre_scal[pre_scal_id][0]; //pwm0命令elsetemp = (temp & 0xfff87fff) |(pre_scal[pre_scal_id][0]<<15); //将其修改为左移15位sunxi_pwm_write_reg(0, temp);          //写命令sunxi_pwm_write_reg((pwm->pwm + 1)  * 0x04, ((entire_cycles - 1)<< 16) | active_cycles);//写数据pwm_debug("PWM _TEST: duty_ns=%d, period_ns=%d, freq=%d, per_scal=%d, period_reg=0x%x\n", duty_ns, period_ns, freq, pre_scal_id, temp);#endifreturn 0;
}

发现其pwm1为进行相应的移位处理,移位后完美解决

root@astar-evb30:/sys/class/sunxi_dump # echo 0x01c21408 > dump;cat dump
echo 0x01c21408 > dump;cat dump
0x5dbf0bb8
root@astar-evb30:/sys/class/sunxi_dump # echo 0x01c21400 > dump;cat dump
echo 0x01c21400 > dump;cat dump
0x0028005f

附常用pwm操作

#include <linux/pwm.h>

struct pwm_device *pwm_request(int pwm_id, const char *label);//0/1:对应pwm编号
void pwm_free(struct pwm_device *pwm);int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns);//占空时间      周期时间
int pwm_enable(struct pwm_device *pwm);void pwm_disable(struct pwm_device *pwm);
//pwm极性
int pwm_set_polarity(struct pwm_device *pwm, enum pwm_polarity polarity);enum pwm_polarity {PWM_POLARITY_NORMAL,PWM_POLARITY_INVERSED,
};

pwm频率输出不对解决思路相关推荐

  1. java使用switch编月份和舱位,纠结,代码和书上的不对解决思路

    Java code/* * 使用switch选择结构 * 使用mo保存月份 * 使用air对飞机舱位进行划分 * 使用switch进行分月,然后对全年的头等舱/经济舱进行划分 */ import ja ...

  2. 有关UC3842芯片输出PWM波形不连续以及PWM频率与RT和CT上的锯齿波频率不一样问题的调试心得记录

    最近在调试基于UC3842芯片的BUCK降压电源,该BUCK电路使用非同步整流拓扑,高端的MOS管驱动使用的是自行使用分立器件搭建的自举升压驱动电路.具体电路图如下所示: 主功率部分: 控制部分电路: ...

  3. STM32用一个定时器输出多路不同频率及占空比的PWM(输出比较模式)

    我们使用STM32输出PWM时会使用定时器的PWM输出模式来进行生成,但是这样子生成PWM是有局限的,它只能生成四路频率相同的PWM,当你设定了TIMx_PSC(预分频寄存器)和TIMx_ARR(自动 ...

  4. STM32CUBEIDE(11)----输出PWM及修改PWM频率与占空比

    STM32CUBEIDE.11----输出PWM及修改PWM频率与占空比 概述 样品申请 视频教学 csdn课程 生成例程 工作过程 __HAL_TIM_SET_COMPARE() 最后 修改PWM频 ...

  5. STM32CUBEMX开发GD32F303(12)----输出PWM及修改PWM频率与占空比

    概述 本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过开发板内进行验证. 本章主要配置定时器输出PWM,同时演示PWM频率与占空比. 需要GD样片的可以加Q ...

  6. STM32输出 PWM频率 占空比 连续可调~~

    来一波不同凡响的PWM 话不多说 直接上代码 我的平台是 stm32F407VGT6 PA0 输出 使用定时器TIM2 //编程输出可调的硬件PWM,频率范围1Hz - 1MHz,占空比0 - 100 ...

  7. STM32F4步进电机速度和位移与定时器输出PWM频率计算

    STM32主频 F1主频只有72M,F4芯片主频最高可以达到168M. F4定时器频率 因为系统初始化SystemInit函数里初始化APB1总线时钟为4分频即42M,APB2总线时钟为2分频即84M ...

  8. H桥驱动电机,STM32 PWM互补输出功能误用分析

    如果排查的思路对你有帮助,请记住 消雨匆匆 or  大吊工. 码字和排查很累,仅此而已 硬件不是抄电路,拿烙铁,懂点软件,细致分析,找问题和破案搜集线索是一样的. 导航车设计项目中,一个新人设计了如下 ...

  9. 爬虫之常见的反爬手段和解决思路

    1 服务器反爬的原因 爬虫占总PV(PV是指页面的访问次数,每打开或刷新一次页面,就算做一个pv)比例较高,这样浪费钱(尤其是三月份爬虫). 三月份爬虫是个什么概念呢?每年的三月份我们会迎接一次爬虫高 ...

最新文章

  1. 机器学习的数学基础 - 信息论
  2. UDF、UDAF、UDTF函数编写
  3. Opencv--图像处理之一阶和二阶偏导数
  4. git 移除项目版本控制_Git - .gitignore怎么忽略已经被版本控制的文件
  5. 勤哲excel服务器点击修改,用勤哲Excel服务器实现工作任务管理系统
  6. 楷书书法规则_书法结构|楷书10大结构原则详解之3--主笔突出原则
  7. 《汽车之家》字体反爬之论坛、问答、文章(新闻、车家号)及其评论爬取
  8. TARA-威胁建模方案2
  9. C语言 数组插入 – 插入排序
  10. php get month,JavaScript从Date对象返回月份 (0 ~ 11)的方法getMonth()
  11. PMP 第六章 项目时间管理
  12. 认识java安全管理器SecurityManager
  13. Unity中实现动态天空盒
  14. printf中如何输出长整型?
  15. 双栈(Dual Stack)
  16. web前端-综合应用案例-简历表页面的制作-educoder
  17. Android平台上做一个完美的音乐频谱--Music Audio Glow
  18. python 读excel pandas_Python使用Pandas读写EXCEL文件教程
  19. dreamweaver html设计,怎么用Dreamweaver设计网页
  20. SQL触发器的使用及语法(转)

热门文章

  1. 使用JMETER进行REST API测试(分步指南)
  2. java和Android学习书籍
  3. java中遍历一个对象的所有属性
  4. Python常用模块 hashlib,pymysql,logging和datetime模块习题检测
  5. 服务间歇性停顿问题优化|得物技术
  6. 惊了 消息中间件合集:MQ(ActiveMQ/RabbitMQ/RocketMQ)+Kafka+笔记
  7. 【ELK】02、ElasticSearch基础
  8. JAVA_HOME指的是什么内容?
  9. 字符串常量和变量是什么?
  10. 微信小程序--操作微信自带的返回按钮使上个页面刷新列表或刷新数据