2569|2

1万

帖子

24

TA的资源

版主

楼主
 

【RPi PICO】DDS正弦发生器和双路PWM输出 [复制链接]

 

来自:https://forum.micropython.org/viewtopic.php?t=9945&p=55587#p55587

 

DDS 的正弦发生器,使用第二个内核生成。为了实现更高的分辨率和更高的频率,它增加了2个PWM信号,每个6位。 

 

  • # DDS Sine Generator in second core by CWE
  • # Example using Double PWM
  • # http://www.openmusiclabs.com/learning/digital/pwm-dac/dual-pwm-circuits/index.html 100k and 1.5k + 4.7nF
  • import time, _thread, sys
  • from machine import Pin, PWM
  • import math
  • import uarray
  • # Construct PWM object, with LED on Pin(25).
  • pwmA = PWM(Pin(15, Pin.OUT)) # upper 6 bits
  • pwmB = PWM(Pin(14, Pin.OUT)) # low 6 bits
  • # Set the PWM frequency.
  • pwmFreq= int(125_000_000/64) # 6 bit
  • pwmA.freq(pwmFreq)
  • pwmB.freq(pwmFreq)
  • pwmA.duty_u16(31<<10)
  • pwmB.duty_u16(31<<10)
  • sineBufLen= 6249 #1kHz: 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)) # 12 bit resolution
  • #print(sineBuf[x])
  • pwmA.duty_u16(0<<10)
  • pwmB.duty_u16(0<<10)
  • ddsCtrl = uarray.array('i',[
  • 0x40050000 + 0x98, # 0 cc7
  • sineBufLen, # 4
  • 1, # 8
  • int((1<<16)*1.0) # 12 1=run, step in half
  • ])
  • @micropython.asm_thumb
  • def dds(r0, r1): # Buffer, ctrl-array
  • mov(r2,r0) # Buffer Start Address
  • ldr(r5, [r1,4]) # buffer length
  • ldr(r4, [r1,0]) # pwm counter compare register
  • ldr(r7, [r1,12]) # step index fine
  • mov(r3,0) # Buffer Index fine
  • label(nextVal)
  • lsr(r0,r3,16) # index coarse
  • lsl(r0,r0,1) # index coarse half words
  • add(r0,r0,r2)
  • ldrh(r0,[r0,0]) # read buffer regPoke(0x40050000 + 0x98, ((a>>6)<<16) + (a&63))
  • lsl(r6,r0,26) # get the lowest 6 bit
  • lsr(r0,r0,6) # shift bits right (upper)
  • lsl(r0,r0,16)
  • lsr(r6,r6,26) # lower 6 bits
  • add(r0,r0,r6)
  • str(r0,[r4,0])
  • #b(retu)
  • add(r3,r3,r7) # next buffer index fine
  • lsr(r0,r3,16)
  • cmp(r5,r0) # end not yet reached
  • bhi(nextVal)
  • lsl(r0,r5,16)
  • sub(r3,r3,r0)
  • mov(r0,r3)
  • ldr(r7, [r1,12]) # reload step index repeat?
  • cmp(r7,0)
  • bne(nextVal)
  • label(retu)
  • @micropython.asm_thumb
  • def regPeek(r0): # Address
  • mov(r1,r0)
  • ldr(r0,[r1,0])
  • @micropython.asm_thumb
  • def regPoke(r0, r1): # Address, Data
  • 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))
  • #sineBuf[0]=1<<6
  • #print(dds(sineBuf, ddsCtrl))
  • _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 #math.sqrt(10)
  • 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))
  • """

 

最新回复

没玩,不过点个赞!!!   详情 回复 发表于 2021-3-3 19:41

赞赏

1

查看全部赞赏

点赞(1) 关注
 
 

回复
举报

7016

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

DDS 的正弦发生器

谢谢分享

 
 
 

回复

1938

帖子

3

TA的资源

版主

板凳
 

没玩,不过点个赞!!!

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
报名最后一周!2025 英飞凌消费、计算与通讯创新大会-北京站
会议时间:3月18日(周二)09:30签到
参会奖励:电动螺丝刀套装、户外登山包、京东卡

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表