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.
64 lines
1.3 KiB
Python
64 lines
1.3 KiB
Python
#!/usr/bin/python
|
|
#
|
|
# pwm_sinewave
|
|
#
|
|
# Calculate values for generate a PWM table for a Sinewave
|
|
# Used on a AVR ATMEGA 328
|
|
#
|
|
# 2013-02-24 tom@dl7bj.de Tom, DL7BJ
|
|
#
|
|
frequency = 488
|
|
cpuclock = 8000000
|
|
pwmbit = 32
|
|
maxdutycycle = 98
|
|
mindutycycle = 2
|
|
|
|
def compute_sinewave(pwmbit, fpeaktopeak, zerobeat):
|
|
t = 1
|
|
ul = []
|
|
tl = []
|
|
while t <= pwmbit:
|
|
u = sin(2*pi*t/pwmbit)
|
|
u = u * fpeaktopeak/2
|
|
u = u + zerobeat
|
|
u = int(round(u))
|
|
print(' ',u,',\t//',t)
|
|
ul.append(u)
|
|
tl.append(t)
|
|
t = t + 1
|
|
return ul,tl
|
|
|
|
import sys
|
|
from math import pi, sin
|
|
from scitools.std import *
|
|
|
|
|
|
|
|
if maxdutycycle <= mindutycycle:
|
|
print("Error - maxdutycycle must be greater than mindutycycle")
|
|
|
|
if maxdutycycle == 100:
|
|
maxamplitude = pwmbit - 1
|
|
else:
|
|
maxamplitude = int((round(pwmbit * maxdutycycle/100.0)))
|
|
|
|
if mindutycycle == 0:
|
|
minamplitude = 1
|
|
else:
|
|
minamplitude = int((round(pwmbit * mindutycycle/100.0)))
|
|
|
|
peaktopeak = maxamplitude - minamplitude
|
|
print("Amplitude from ", minamplitude, " to ", maxamplitude, "(", peaktopeak," Schritte)")
|
|
|
|
zerobeat = int(round((minamplitude + maxamplitude)/2.0))
|
|
print("Zerobeat on PWM step ", zerobeat)
|
|
|
|
fpeaktopeak = float(peaktopeak)
|
|
|
|
ulist,tlist = compute_sinewave(pwmbit,fpeaktopeak,zerobeat)
|
|
plot(tlist,ulist)
|
|
|
|
savefig('tmp.eps')
|
|
|
|
print("Ready.")
|