[DAC] 脑死亡式软控架构

[复制链接] 查看: 897|回复: 7

27

主题

1

好友

484

积分

业余侠客 当前离线

Rank: 4

UID
787724
帖子
422
精华
0
经验
484 点
金钱
394 ¥
注册时间
2015-3-20
发表于 2024-2-3 01:27 | 显示全部楼层
本帖最后由 丰年好大雪 于 2024-2-3 01:30 编辑

发过几个软控的教程,蹦出来几个活宝,嫌太麻烦,嫌喂饭没喂到嘴里。

OK吧,其实我是希望能让网友试着学习一下单片机的基础操作,包括寄存器和官方库两种模式,没想到还是嫌弃复杂。还有嫌我动寄存器不对的,我自己的芯片,我爱怎么调整怎么调整,你管得着么?声音不好我再把语句去掉,事实上DAC芯里绝大多数寄存器怎么变都不会有什么可闻变化。还有嫌STC的51没有技术含量的,我也不知道一个控制寄存器的单片机需要什么技术含量,用STM32这种东西你要干什么?搭一个STM32的编译环境再用上HAL库,你要再加上机器视觉和人工AI么?

面对这样的杠精用户,我现在给你们一个简单的、便宜的、连唐氏患者都能用的简单方案,虽然简单,但性能相当相当的高!有多高?有三、四层楼那么高!什么?Arduino?那个对于许多网友仍然太麻烦、配置太低端了,我们要的是又便宜又硬核的开发板!

首先你需要设计个软控DAC的实验板,软控模式的dac板淘宝上极少见,自己画吧,然后预留出软控的接口,自板上引出:DGND、SCL、SDA三路信号即可。记得SCL和SDA要接两个10K电阻到DVDD 3.3V上拉。如果觉得单片机还可以多做一点事情,可以把RESET(EN)脚也引出来,如果还觉得不够,可以把静音继电器的驱动三极管基极Mute_on引出来。这几个信号引出来,如果是单纯做实验,可以用插针单纯引出,用单片机插杜邦线控制,如果想像点样,可以用2.54排针做一个基座把单片机插在板子上一体化调试。

然后你们需要上网买一个这个东西:


记得买9块9的简约版!!

ESP32C3开发板,这个板可能也是世界上最便宜的32位智能系统开发板了,这个系统的主芯片的主频可达240Mhz,而且是双核心!满足了你装逼的需求,当然我们的工作只需要一个核心。这个芯片还自带蓝牙以及WiFi功能!现在ESP32已经成了嵌入式系统中全世界最最最最受欢迎的一个产品了,没有之一,包括Arduino的开发平台、Micropython开发平台都支持它!其最高型号ESP32S3只要外设配全了,能当一台工控小电脑使用,指挥生产线、无人机、智能避障小车、机器学习是一点问题也没有!让你买的C3版是一个S3的阉割版,去掉了很多没用的东西,当然那些酷炫功能我们一个也不会用到,就图他便宜。 最关键的,编程环境是脑死亡式的容易!

如果你要做的是一体式的板子,记得规划好插座的大小,最关键的,是要引出SDA和SCL两个引脚,这个板子的定义是这样的:


其他的GPIO脚位,都可以引出!作为通用引脚去控制上下拉的信号,控制静音、RESET等开关,记得驱动继电器等重负载一定要加晶体管驱动!

这个板子到手后,直接插USB线到你电脑上,然后只需要从官网下一个叫Luatools的工具,这个东西安装完是这样的:


打开它是这样的:


Luatools里有官方的新版固件,记得给开发板刷固件,要点这个:


要刷固件,先点击这个:


再选择Luatools/resource这里面的新版固件文件:


再点击下载,就可以通过USB线给你的ESP32刷新版固件了。

返回到上一级,选择右上方的“项目管理测试”:


这个页面里面,记得上边这个要选择你刚刷完的固件,因为固件决定了你的mcu开通了哪些功能。然后选择脚本,就是例程或你自己编写的程序。最后刷进ESP32,就可以看效果了。


默认的合宙ESP32C3开发板上已经有个例程,就是下方的两个LED在频闪,首先我们要刷一个不太一样的可视化例程看看能不能工作。我们找一下这个例程:
盘符:\LuatOs\Luatools\resource\soc_script\v2024.xx.xx.xx\demo\ADC\main.lua

这个例程是个ADC测温例程,可以给mcu自己测温,我们下载完了之后,板子上的led就变成不确定状态了,不管他,回到主界面打开串口,然后就能看到ESP32正在通过串口把温度数字一直向串口打印,你可以把手指按在ESP32的mcu芯片上,几秒内就能看到温度在慢慢变化,确定能工作,这就够了。


歇歇再写。

27

主题

1

好友

484

积分

业余侠客 当前离线

Rank: 4

UID
787724
帖子
422
精华
0
经验
484 点
金钱
394 ¥
注册时间
2015-3-20
 楼主| 发表于 2024-2-3 02:26 | 显示全部楼层
本帖最后由 丰年好大雪 于 2024-2-3 02:35 编辑

然后呢,你需要到盘符:\luatos\resource\soc_script\v2024.xx.xx.xx\demo\i2c下,对,这个例程就是干这个的,演示I2C接口用的,在这个目录下找到main.lua,用笔记本打开它,你会看到:

-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "i2c 24c02 demo"
VERSION = "1.0.0"

-- sys库是标配
sys = require("sys")

--1010 000x
--7bit地址,不包含最后一位读写位
local addr = 0x50
-- 按照实际芯片更改编号哦
local i2cid = 0

sys.taskInit(function()
    log.info("i2c initial",i2c.setup(i2cid))
    while true do
        --第一种方式
        i2c.send(i2cid, addr, string.char(0x01).."1234abcd")
        sys.wait(100)
        i2c.send(i2cid, addr, string.char(0x01))
        local data = i2c.recv(i2cid, addr, 8)
        log.info("i2c", "data1",data:toHex(),data)

        --第二种方式
        i2c.writeReg(i2cid, addr, 0x01, "abcd1234")
        sys.wait(100)
        local data = i2c.readReg(i2cid, addr, 0x01, 8)
        log.info("i2c", "data2",data:toHex(),data)
        sys.wait(1000)
    end

end)

-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!


上边的感叹号不是我加的,这个产品系列的例程就是这样的简单粗暴。我们下面要做的事情,就是按照自己的想法,去把I2C例程里的内容换成我们想控制的DAC芯片内容,当然如果你想,也可以发挥胶水技能,把GPIO例程中的内容移植过来一部分,以达成控制额外引脚实现开机RESET和静音都由ESP32来控制。

而GPIO例程,看起来是这样的:

-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "gpiodemo"
VERSION = "1.0.1"

log.info("main", PROJECT, VERSION)

-- sys库是标配
_G.sys = require("sys")

if wdt then
    --添加硬狗防止程序卡死,在支持的设备上启用这个功能
    wdt.init(9000)--初始化watchdog设置为9s
    sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
end

-- Air780E的AT固件默认会为开机键防抖, 导致部分用户刷机很麻烦
if rtos.bsp() == "EC618" and pm and pm.PWK_MODE then
    pm.power(pm.PWK_MODE, false)
end

--下面的GPIO引脚编号,请根据实际需要进行更改!
-- Air101开发板的3个LED分别为 PB08/PB09/PB10
-- Air103开发板的3个LED分别为 PB24/PB25/PB26
-- Air105开发板的3个LED分别为 PD14/PD15/PC3

-- 若下载到设备后提示pin库不存在,请升级固件到V0006或以上


--【HaoSir2022】于2022年4月21日增加
local rtos_bsp = rtos.bsp()
function pinx() -- 根据不同开发板,给LED赋值不同的gpio引脚编号
    if rtos_bsp == "AIR101" then -- Air101开发板LED引脚编号
        return pin.PB08, pin.PB09, pin.PB10
    elseif rtos_bsp == "AIR103" then -- Air103开发板LED引脚编号
        return pin.PB26, pin.PB25, pin.PB24
    elseif rtos_bsp == "AIR601" then -- Air103开发板LED引脚编号
        return pin.PA7, 255, 255
    elseif rtos_bsp == "AIR105" then -- Air105开发板LED引脚编号
        return pin.PD14, pin.PD15, pin.PC3
    elseif rtos_bsp == "ESP32C3" then -- ESP32C3开发板的引脚
        return 12, 13, 255 -- 开发板上就2个灯
    elseif rtos_bsp == "ESP32S3" then -- ESP32C3开发板的引脚
        return 10, 11, 255 -- 开发板上就2个灯
    elseif rtos_bsp == "EC618" then -- Air780E开发板引脚
        return 27, 255, 255 -- AIR780E开发板上就一个灯
    elseif rtos_bsp == "EC718P" then -- Air780E开发板引脚
        return 27, 255, 255 -- AIR780EP开发板上就一个灯
    elseif rtos_bsp == "UIS8850BM" then -- Air780UM开发板引脚
        return 36, 255, 255 -- Air780UM开发板上就一个灯
    else
        log.info("main", "define led pin in main.lua")
        return 0, 0, 0
    end
end


--LED引脚判断赋值结束

local P1,P2,P3=pinx()--赋值开发板LED引脚编号
local LEDA= gpio.setup(P1, 0, gpio.PULLUP)
local LEDB= gpio.setup(P2, 0, gpio.PULLUP)
local LEDC= gpio.setup(P3, 0, gpio.PULLUP)


sys.taskInit(function()
--开始流水灯
    local count = 0
    while 1 do
    --流水灯程序
        sys.wait(500) --点亮时间
        -- 轮流点灯
        LEDA(count % 3 == 0 and 1 or 0)
        if P2 and P2 ~=255 then
            LEDB(count % 3 == 1 and 1 or 0)
        end
        if P3 and P3 ~= 255 then
            LEDC(count % 3 == 2 and 1 or 0)
        end
        log.info("GPIO", "Go Go Go", count, rtos.bsp())
        log.info("LuatOS:", "https://wiki.luatos.com")
        count = count + 1
    end
end)

-- API文档 https://wiki.luatos.com/api/gpio.html

-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!


看到上边的例程里有“--”符号了么?这个符号就是lua语言的单行注释符,等效于C语言里的“//”,这个符号后边的内容都不参与编译,做注释用的。
这个例程,就是让你的开发板上LED闪烁的例程,使用了同I2C例程同样的库,库里有什么,能干什么,不重要,你只需要重新开个新文本复制粘贴+修改就行了。

而我们修改之后的结果,大体是下面这样,我以AK4490/95/97芯片的出声例程来举例:

--下边就是个名字,你爱写啥写啥
PROJECT = "dacdemo"
VERSION = "1.0.0"

_G.sys = require("sys")

--我们不需要硬件狗

--下面定义一下GPIO脚位
local rtos_bsp = rtos.bsp()
function pinx()
    elseif rtos_bsp == "ESP32C3" then
        return xx, xx -- xx为接继电器或DAC reset引脚的脚位
    end
end

local P1,P2 =pinx() --赋值开发板GPIO脚位编号
local RESETA= gpio.setup(P1, 0, gpio.PULLUP) --假定这是RESET脚
local RESETB= gpio.setup(P2, 0, 0) --假定这是继电器控制脚,初始拉低

--再定义一下DAC的7bit地址
local addr = 0x10
-- AK449X系列芯片在AD0和1都接地的7bit地址是这个,后边加上'写'动作为0,函数尾巴自动加个零变成0x20
local i2cid = 0

--OK,全部定义完成,下面是主程序

sys.taskInit(function()

--下面首先是解除DAC RESET脚位,下拉一下,再上拉
    while 1 do
        RESETA(0)
        sys.wait(100) --下拉时间
        RESETA(gpio.PULLUP)  --再上拉       
    end

--还记得让AK芯片转起来的统一寄存器读写么?0x01,0x02;0x08,0x0C;0x00,0x9F 一共三组
    log.info("i2c initial",i2c.setup(i2cid))
    while 1 do
        i2c.send(i2cid, addr, string.char(0x01),string.char(0x02))
        sys.wait(100)
        i2c.send(i2cid, addr, string.char(0x08),string.char(0x0C))
        sys.wait(100)
        i2c.send(i2cid, addr, string.char(0x00),string.char(0x9F))
        sys.wait(100)
    end

--下面首先是解除继电器控制脚位,直接上拉
    while 1 do
        RESETB(gpio.PULLUP)
    end
end)

sys.run()
--完事


直接把这个文本文件单独放一个目录,再给个main.lua的名字,用luatools烧写,OK了。

12

主题

1

好友

606

积分
     

职业侠客 当前在线

Rank: 5Rank: 5

UID
349251
帖子
628
精华
0
经验
606 点
金钱
592 ¥
注册时间
2011-6-10
发表于 2024-2-6 08:58 来自手机端 | 显示全部楼层
谢谢楼主科普,对于我们不懂编程的来说,确实需要讲详细一些。

2

主题

0

好友

28

积分

注册会员 当前离线

Rank: 2

UID
1090997
帖子
26
精华
0
经验
28 点
金钱
24 ¥
注册时间
2024-2-12
发表于 2024-2-13 17:35 | 显示全部楼层
强啊老哥

2

主题

0

好友

28

积分

注册会员 当前离线

Rank: 2

UID
1090997
帖子
26
精华
0
经验
28 点
金钱
24 ¥
注册时间
2024-2-12
发表于 2024-2-13 17:36 | 显示全部楼层
我学了一点点adruino,有没有可能有个adruino的案例,求

7

主题

3

好友

554

积分

职业侠客 当前离线

Rank: 5Rank: 5

UID
793062
帖子
549
精华
0
经验
554 点
金钱
529 ¥
注册时间
2015-5-23
发表于 2024-2-13 18:07 | 显示全部楼层
本帖最后由 xdming 于 2024-2-13 18:10 编辑

无话可说

42

主题

0

好友

227

积分

业余侠客 当前在线

Rank: 4

UID
1039312
帖子
188
精华
0
经验
227 点
金钱
145 ¥
注册时间
2023-4-2
发表于 2024-2-13 22:12 | 显示全部楼层
软控我只想设置ess单声道

10

主题

0

好友

279

积分

业余侠客 当前在线

00后的小烧友

Rank: 4

UID
971156
帖子
266
精华
0
经验
279 点
金钱
254 ¥
注册时间
2022-6-18
发表于 2024-4-7 11:14 | 显示全部楼层
老师威武
这软控教程简直就是保姆级。
肯无保留、手把手教技术的,真的不多。
有些人天生“衣来张口,饭来伸手”,还嫌衣服穿不上,饭不在口里
还得是多学多练,自己动手,丰衣足食。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Powered by Discuz! X3.4

© 2001-2012 Comsenz Inc.

返回顶部