-
-
-
-
- import time, _thread, sys
- from machine import Pin, PWM
- import math
- import uarray
-
-
- pwmA = PWM(Pin(15, Pin.OUT))
- pwmB = PWM(Pin(14, Pin.OUT))
-
-
-
- pwmFreq= int(125_000_000/64)
- pwmA.freq(pwmFreq)
- pwmB.freq(pwmFreq)
- pwmA.duty_u16(31<<10)
- pwmB.duty_u16(31<<10)
-
- sineBufLen= 6249
- sineBuf=uarray.array("H",range(0,sineBufLen))
- for x in range(0,sineBufLen):
- xr= x/sineBufLen*2*math.pi
- sineBuf[x]= 2047+int(2047*math.sin(xr))
-
-
- pwmA.duty_u16(0<<10)
- pwmB.duty_u16(0<<10)
-
- ddsCtrl = uarray.array('i',[
- 0x40050000 + 0x98,
- sineBufLen,
- 1,
- int((1<<16)*1.0)
- ])
-
- @micropython.asm_thumb
- def dds(r0, r1):
-
- mov(r2,r0)
- ldr(r5, [r1,4])
-
- ldr(r4, [r1,0])
- ldr(r7, [r1,12])
-
- mov(r3,0)
-
- label(nextVal)
-
- lsr(r0,r3,16)
- lsl(r0,r0,1)
- add(r0,r0,r2)
- ldrh(r0,[r0,0])
- lsl(r6,r0,26)
- lsr(r0,r0,6)
- lsl(r0,r0,16)
-
- lsr(r6,r6,26)
- add(r0,r0,r6)
-
- str(r0,[r4,0])
-
-
- add(r3,r3,r7)
- lsr(r0,r3,16)
-
- cmp(r5,r0)
- bhi(nextVal)
-
- lsl(r0,r5,16)
- sub(r3,r3,r0)
- mov(r0,r3)
-
- ldr(r7, [r1,12])
- cmp(r7,0)
- bne(nextVal)
-
- label(retu)
-
-
-
-
- @micropython.asm_thumb
- def regPeek(r0):
- mov(r1,r0)
- ldr(r0,[r1,0])
-
- @micropython.asm_thumb
- def regPoke(r0, r1):
- str(r1,[r0,0])
- mov(r0,r1)
-
- def regSet(adress, mask):
- regPoke(adress, regPeek(adress) | mask)
-
- def setF(f):
- ddsCtrl[3]=int(f/1000*(1<<16))
-
-
-
- _thread.start_new_thread(dds, (sineBuf, ddsCtrl))
-
-
- try:
- while True:
- f=10
- while f<25_000:
- setF(f)
- time.sleep(.2)
- print(f, end=" ")
- f=f*1.5849
-
- except KeyboardInterrupt:
- ddsCtrl[3]=0
- sys.exit()
-
-
- """
- x=0
- delta=10
-
-
- while True:
- x+= delta
- if x>(sineBufLen-1):
- x-=sineBufLen
- a= sineBuf[x]
- #pwmA.duty_u16( (a<<4) & (255<<8)) # upper 6 bit
- #pwmB.duty_u16( (a<<10) & (255<<8)) # lower 6 bit
- regPoke(0x40050000 + 0x98, ((a>>6)<<16) + (a&63))
- #regPoke(0x40050000 + 0x98, ((a>>6)<<16))
- """
-