5 ms·
Well, it Sigma-Delta modulation which isn't PWM.
by FullyFunctional 6y ago
Well, it Sigma-Delta modulation which isn't PWM.
- FullyFunctional 6y agoI should have added: "But Sigma-Delta is as easy (in fact, probably easier) to implement that I really don't understand why people ever use PWM anywhere. It's so inferior IMO."
- etaioinshrdlu 6y agoWell PWM is probably easier to analyze mathematically. The harmonics produced are more predictable. Knowing min off-time and on-time so easily is helpful when designing circuits. It's also super easy to implement PWM in digital logic or software, it basically needs only timer and a comparator.
- nyanpasu64 6y agoDoes PWM generate weird phase artifacts when switching between low and high amplitudes? Much like Doppler distortion in earbuds?
- FullyFunctional 6y agoSigma-Delta is just an adder which is equivalent to a comparator thus it might be cheaper actually: module pdm(clk, level, O); parameter N = 16; input wire clk; input wire [N-1:0] level; output wire O; reg [N+1:0] sigma = 0; assign O = ~sigma[N+1]; always @(posedge clk) sigma <= sigma + {O,O,level}; endmodule I’ll grant you that PWM is a bit more intuitive. I bet there is a more thorough comparison between them but I haven’t seen it.
- dreamcompiler 6y agoSigma-Delta is very easy to implement as well; it just requires a different way of thinking. In S-D you always try to preserve and compensate for the errors you make in quantization, while in PWM you throw the errors away. In physics you'd label S-D an error-conserving system vs PWM an error-dissipative system.
- FullyFunctional 6y agoWell put. Another example is Floyd–Steinberg dithering which is also error-conserving. My (effectively one-line) implementation above was derived from first-principle: Given a desired target level 0 <= T <= 1, control the output O in {1,0}, such that O on on average is T. Do this by integrating the error T - O over time and switching O such that the sum of (T - O) is finite. S = O = 0 loop: S = S + (T - O) O = (S >= 0) In fixed point arithmetic this becomes even simpler (assume N-bit arith) S = Sf * 2^N = Sf << N. As |S| <= 1, N+2 bits is sufficient S = O = 0 loop: D = T + (~O + 1) << N === T + (O << N) + (O << (N+1)) S = S + D O = 1 & ~(S >> (N+1)) and that's the Verilog below
- dreamcompiler 6y agoCompletely agree. I've always considered Floyd-Steinberg dithering to be a 2D version of Sigma-Delta. It's all about diffusing and minimizing error quantities, to trade higher sampling rate for lower sample resolution while conserving total information content. Another example is Bresenham's algorithm for drawing straight lines on raster displays. The quantity being approximated there is the slope of the line, which is approximated with minimal diffused error as the line is being drawn with only integer adds and subtracts. No divisions and no floating point needed. These are some of the most subtly beautiful algorithms in computing.