pwm驱动原理和代码实现

本文介绍了s3c2440 PWM驱动的工作原理,涉及I/O映射、内存映射以及Linux内核的内存分配。通过分析PWM的工作原理和编写相关代码,展示了如何实现PWM驱动,包括蜂鸣器和可调频率的PWM功能。在实践过程中遇到了地址映射错误和终端无响应等问题,并给出了手动创建设备节点的方法。
摘要由CSDN通过智能技术生成

        学这个pwm真是非常曲则,首先是看s3c2440的datasheet,全英文的,而且还有硬件的时序图(很多是硬件的工作原理,和软件控制不相关)。看了很久加上网上看了资料才把这个pwm弄通。当然,其中牵扯到了几个知识,基本都弄通了。后面会通过blog一一列出来。

        第一个知识点:I/O映射和内存映射所牵扯到的知识点,包括统一编址和独立编址,以及linux下怎么对这两种方式编程,以及这两种方式下怎么访问外设。

        第二个知识点:映射到内存哪里?怎么映射?所以就涉及到linux内核的内存分布问题,顺便也分析了几个内核内存分配函数的区别。

        这里对几个涉及到的知识点不展开来分析,后面会详细讲解下。这里只对pwm的工作原理和驱动分析下。

        我最开始有写个简单的峰鸣器驱动,不能调频率的: s3c2440 杂项驱动实现蜂鸣器 里面用杂项设备驱动使峰鸣器工作,当然里面都是调用了s3c2440下提供的读写函数。这个对移植来说不是很好,我这篇blog是用通用的函数从底层一步步使pwm工作的。

        首先是说下mini2440,我用的开发板是mini2440的,也就是s3c2440处理器。最开始我还不知道s3c2440是一款cpu,我在linux源码的 arch/arm平台中找到了s3c2440,然后我才找资料了解了下s3c2440处理器。其中主要的是了解s3c2440的I/O编址,s3c2440是统一编址其实就是内存映射了。

        s3c2440提供了__raw_readl() 等函数来读写I/O,我在s3c2440系统自带的管脚宏和函数 blog也分析过这些函数的源码(好像有点乱),我这里不用s3c2440提供的系统I/O操作函数,自己映射地址,用通用的ioread()系列函数来操作端口;

        首先是pwm的工作原理,这个可以看下我转载的一篇blog,简明扼要的讲清楚了pwm的工作原理: pwm的工作原理;当然也可以看看芯片的datasheet,总之看懂了就感觉很容易了。下面直接上代码:

regAddr.h代码

 #ifndef __REG_ADDR_H__
 #define __REG_ADDR_H_

 /*
#define GPBCON ((volatile unsigned long*)0x56000010)
#define GPBDAT ((volatile unsigned long*)0x56000014)

#define TCFG0 ((volatile unsigned long *)0x51000000)
#define TCFG1 ((volatile unsigned long *)0x51000004)

#define TCON  ((volatile unsigned long *)0x51000008)

#define TCNTB0  ((volatile unsigned long *)0x5100000c)
#define TCMPB0  ((volatile unsigned long *)0x51000010)
#define TCNTO0  ((volatile unsigned long *)0x51000014)
 */
 
 #define GPBCON ((unsigned long)0x56000010)
 #define GPBDAT ((unsigned long)0x56000014)
 
 #define TCFG0 ((unsigned long)0x51000000)
 #define TCFG1 ((unsigned long)0x51000004)
 
 #define TCON  ((unsigned long)0x51000008)
 
 #define TCNTB0  ((unsigned long)0x5100000c)
 #define TC
PWM IGBT驱动电路的原理图如下所示: 为了实现PWM IGBT驱动电路,需要四个主要部分:光电隔离电路、电机驱动逻辑电路、驱动信号放大电路和H桥功率驱动电路。这些部分共同工作,以控制IGBT的开关状态和频率。 其中,光电隔离电路用于实现输入信号和输出信号之间的隔离,以保护控制电路和驱动电路之间的安全性。电机驱动逻辑电路负责处理输入信号,并生成相应的控制信号来控制IGBT的开关动作。驱动信号放大电路用于放大逻辑电路生成的控制信号,以提供足够的电流和电压来驱动IGBT。H桥功率驱动电路则负责将放大后的信号传递给IGBT,以实现IGBT的开关动作。 总结起来,PWM IGBT驱动电路通过光电隔离电路隔离输入和输出信号,通过电机驱动逻辑电路生成控制信号,通过驱动信号放大电路放大信号,最后通过H桥功率驱动电路驱动IGBT的开关动作,实现对IGBT的控制。 描述了PWM IGBT驱动电路的四个主要部分 显示了IR2104芯片的基本接线图,该芯片可兼容3.3V和5V逻辑电平 双极同相Totem-Pole驱动器是一种常用且成本效益高的驱动电路,用于驱动MOSFET。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [基于H桥PWM控制的直流电机正反转调速驱动控制电路](https://download.csdn.net/download/weixin_38694336/20058787)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [H桥PWM直流电动机驱动器(原理图、代码)](https://blog.csdn.net/weixin_42880082/article/details/125038141)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [MOSFET 和 IGBT 栅极驱动器电路的基本原理学习笔记(二)栅极驱动参考](https://blog.csdn.net/qq_41600018/article/details/128192190)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值