You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

52 lines
1.2 KiB
Python

#!/usr/bin/env python
#
# pwm_sinewave
#
# Calculate values for generate a PWM table for a Sinewave
# Used on a AVR ATMEGA 328
#
# 2023-07-10 tom@dl7bj.de Tom, DL7BJ
#
import sys
import matplotlib.pyplot as plot
from math import pi, sin, cos, asin, acos
pwmbit = 63
zerobeat = 128
peaktopeak = 254
def compute_sinewave(pwmbit, fpeaktopeak, zerobeat):
t = 0
ul = []
tl = []
l = 0
while t <= pwmbit:
u = sin(2*pi*t/pwmbit)
u = u * fpeaktopeak/2
u = u + zerobeat
u = int(round(u))
if t < pwmbit:
print(format(u,'#04x'),',',sep='',end='')
else:
print(format(u,'#04x'),' ',sep='',end='')
l = l + 1
if l == 16:
print(' // ', t + 1)
l = 0
ul.append(u)
tl.append(t)
t = t + 1
return ul,tl
print("Zerobeat on PWM step ", zerobeat)
print("Peak to peak on PWN ", peaktopeak)
print("const unsigned char sinewave[] PROGMEM = {")
ulist,tlist = compute_sinewave(pwmbit,peaktopeak,zerobeat)
print("};")
plot.plot(tlist,ulist)
plot.savefig('../Pictures/sinewave-line.jpg')
plot.plot(tlist,ulist,linestyle=':',marker='.')
plot.savefig('../Pictures/sinewave-dots.jpg')
print("Ready.")