只用一条加法指令实现的PWM算法,软硬都行
0赞只用一条加法指令实现的PWM算法,软硬都行
- 基于累加的PDM算法(1)
A PWM Algorithm For Software And Hardware Realized With Only One Add Instruction
- A PDM Algorithm Based On Addition (1)
现在出的微控制器,几乎没有不带PWM输出的。PWM一般都用特殊的定时器电路实现。
PWM的本质是在脉冲总周期Nt内输出累积时间为Ht的正脉冲。
本人提出过一种算法,用C语句表达如下:
CNT += H ;
if ( CNT >= N )
{ CNT %= N ; Pout = 1 ; }
else Pout = 0 ;
// 每个t计算一次;
// N为任一正整数,H为0 ~ (N-1),CNT为累计数并保存模除余数。
严格讲,本算法应称为“基于累加的PDM(Pulse Density Modulation)算法”。
本算法可以用FPGA/CPLD或PSoC UDB的Datapath硬件实现,资源占用恐怕比常规PWM还要少。而软件实现,在任何单片机上都可以做,只要它有一个最简单的定时器,就可做出任意多个PDM输出。
本文附上一个用PSoC4 Pioneer Kit实现的实例,软硬并用。其中,红色LED用UDB的Datapath调光;简单到只用一条指令:A0 = A0 + D0,进位co_msb通过引脚输出给红灯。而绿色、蓝色二只LED在SysTick中断里用软件进行调光。三灯都用10KHz时钟,即每100uS计算一次。为便于看程序,没有用汇编。
实例:ZhuPDM8(PSoC Creator 2.2 SP1).rar
用PSoC4 Pioneer Kit做实例,也是表示我对AET“赛普拉斯PSoC4”主题季活动的支持。更主要的是PSoC(从PSoC3起)UDB的Datapath是我将本算法在MCU芯片内用硬件实现的第一种芯片,而且是目前唯一的一种MCU。这也是我推崇PSoC UDB的原因,而且爱“PSoC Datapath”及“PSoC葡萄酒”。
二十多年前,单片机内还没有PWM,这种算法是我自己逼出来的,算是一种“独门绝技”,我只告诉过几个朋友。如果什么人发现有谁谁谁在什么地方使用这种方法,请告诉我,我会把“独门”二字去掉。
应该说,一个表达式和一个实例,已经把算法叙述清楚了。
===
FY_ZHU
2013-07-18 BOS-MA