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
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.")
|