打印
[开源硬件]

准备DIY个简易镊子LCR表

[复制链接]
7673|33
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yjmwxwx|  楼主 | 2021-8-10 15:45 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
别的论坛有人引诱我搞LCR表,本来要做指南针的,只能先试试做这个了,正好我想练练画电路板,于是拿出去年做的电路改改,想改单锂电池供电,但是没低压差电源芯片,也没3.3V显示器和模拟开关,没办法只能搞成两块电池的了,我也没上过什么学不懂什么原理,所以我只会做不会说,说说容易做准做稳定我是没那个能力。。争取做的比去年做的强点吧,目标低成本能用就好。
目前只搞了个100KHZ的100欧档。

又要浇地了,10天前下的雨不管用啊,浇地回来休息休息再加功能。。

电路图


KICAD原理图和程序源代码

LCR.zip (133.29 KB)

实物





视频,100KHZ测100欧、500欧、10NF电容



搞到这里可能才完成十分之二的工作量,这方案还不知道行不行。。






使用特权

评论回复

相关帖子

沙发
LcwSwust| | 2021-8-11 09:21 | 只看该作者
楼主要不画个PCB吧,最近打样比较便宜,听说有的厂家免费。
尽量用贴片元件,显示屏可以用OLED减小体积。

使用特权

评论回复
板凳
yjmwxwx|  楼主 | 2021-8-11 18:16 | 只看该作者
LcwSwust 发表于 2021-8-11 09:21
楼主要不画个PCB吧,最近打样比较便宜,听说有的厂家免费。
尽量用贴片元件,显示屏可以用OLED减小体积。 ...

我已经画过两次实际电路的PCB了,但是都在吃灰根本用不上,反而画的转接板用上了。。我这很多零件都是直插的,不可能为了免费做PCB再去买贴片零件,尽量用我有的零件搞DIY,今年已经花了300元买电子相关的东西了,以后不考虑再花钱买东西玩了,听各位网友的准备弃坑了。

使用特权

评论回复
评论
yjmwxwx 2021-8-22 10:37 回复TA
@wenleileilei :要啥没啥不能缺什么买什么,现在我这库存零件还有一些,先消耗下库存 
wenleileilei 2021-8-22 03:36 回复TA
越省钱越费钱 
地板
yjmwxwx|  楼主 | 2021-8-14 23:08 | 只看该作者
加自动量程功能

LCR.zip (134.2 KB)

档位切换慢怎么办?

使用特权

评论回复
5
yjmwxwx|  楼主 | 2021-8-19 18:57 | 只看该作者
写频率切换程序失败,LCD1602第一行第一个数据是频率,1=100HZ、2=1KHZ、3=10KHZ、4=100KHZ。第二个数据是阻抗,第二行是档位。演示测1K电阻和104电容,测电阻还行,测电容失败,不知道是程序原因还是电路原因。。。









本来想搞个电路简单的,有人提建议让我加放大。。加放大问题多多,原理感觉都懂,写一个档位一个频率手动切换档位的还行,搞多档位自动切换让我嘴说说能行,动手实际做遇到一些问题。。。关键不知道是程序有问题还是电路有问题,最有可能的是两样都有问题。。

失败啦





lcr.pdf (100.31 KB)

LCR.zip (246.74 KB)






使用特权

评论回复
6
一叶倾城wwq| | 2021-8-27 11:40 | 只看该作者
楼主不要轻言放弃啊,我们等你更新

使用特权

评论回复
评论
yjmwxwx 2021-8-27 12:46 回复TA
这方案好像不太行。。 
7
luohao316| | 2021-8-27 17:25 | 只看该作者
祝你成功。**下去,即便不成功,你也能体会到在学校学的模拟电路,基本上是不能直接拿来用的。

使用特权

评论回复
评论
yjmwxwx 2021-8-27 21:48 回复TA
关键是模拟电路我都没学过。。。失败是正常的 
8
yjmwxwx|  楼主 | 2021-9-3 20:40 | 只看该作者
本帖最后由 yjmwxwx 于 2022-1-24 09:10 编辑

做的板子到了,感觉还不如飞线的,飞线的还有个外壳,有板子还是要做外壳,业余DIY实在是没必要做板子。

硬件也就这样了,软件好像没啥动力搞了,快要秋收了,练练身体准备干活,坐在电脑前写程序太伤身。












电路原理图和程序
lcr_1.zip (1.07 MB)
https://github.com/yjmwxwx/stm32asm/tree/master/gcm0/lcr_1



使用特权

评论回复
9
9999jim| | 2021-9-17 15:20 | 只看该作者
没事的时候多琢磨一下,半途就弃了,挺可惜的。要加油哦~

使用特权

评论回复
10
yjmwxwx|  楼主 | 2022-1-24 08:57 | 只看该作者
又搞了个UTC MC4580运放版的,这运放虽然便宜但是不怎么好用,切换放大倍数时候会抖动一下,以前用NE5532没发现这样,这版主要失败在这运放上面,大信号切换到小信号就会抖动一下,造成后面采样异常。









电路图



kicad.zip (602.73 KB)
PCB
lcr_2.zip (240.56 KB)

程序
程序.zip (23.49 KB)

https://github.com/yjmwxwx/stm32asm/tree/master/gcm0/lcr_2

演示视频,简单分辨几种电容和电阻,可以看到误差比较大还有的数据不正常,那是因为档位切换不对造成的。

按键2频率加,虽然两个按键但是那个在测量模式没用。

屏幕第一行显示阻抗,第一个是电阻第二个是电抗
第二行显示角度和电容电感数值(小数点可能有问题)



我写的程序太差了,为了让程序固件在16K之内没设置默认校准表,要手动校准才能用。

校准方法测量模式两个按键一块按进入校准模式,过一会显示要校准的档位,根据档位选电阻夹子上,默认调到0度,要改得改程序,校准表没数据会显示179.99度。由于IO紧张按键和SWD调试口公用没办法调试。


虽然越校越不准但是也演示下校准方法,太麻烦只演示前面几个档位,校完了会显示校准完成请关机



使用特权

评论回复
11
yjmwxwx|  楼主 | 2022-1-24 09:00 | 只看该作者
9999jim 发表于 2021-9-17 15:20
没事的时候多琢磨一下,半途就弃了,挺可惜的。要加油哦~

这一干农活就打断搞DIY了,闲了好几个月,我技术不行,靠制作来学技术,所以做的东西都不好用。

使用特权

评论回复
12
playzlov| | 2022-1-28 13:45 | 只看该作者
这个还是要用贴片加小屏幕带劲啊

使用特权

评论回复
13
yjmwxwx|  楼主 | 2022-1-28 21:59 | 只看该作者
焊了个用NE5532版的,这个开关瞬间比4580抖动的小多了,没贴片的还是飞线焊的。。
现在就缺个开路、短路、匹配的校准程序了,虽然公式很简单,但是汇编定点数写也比较麻烦,哎。。。




lcr_3.pdf (120.46 KB)











使用特权

评论回复
14
yjmwxwx|  楼主 | 2022-1-28 22:35 | 只看该作者
playzlov 发表于 2022-1-28 13:45
这个还是要用贴片加小屏幕带劲啊

好是好,关键那得要有这些啊,类似何不食肉糜,这次已经很多都是贴片的了,电阻库存直插的还没用上就没买,这种密度稍微大点的板子还是第一次画,主要为了连连手,要不是免费做板子根本不会练这个,立创真会做生意,免费做板子好让人买他的元器件,不知不觉被坑了。

使用特权

评论回复
15
yjmwxwx|  楼主 | 2022-2-4 09:45 | 只看该作者
本帖最后由 yjmwxwx 于 2022-2-5 12:41 编辑



SM(开路、短路、匹配)校准程序写完  这东西就俩乘法一个除法感觉是程序里面最麻烦的,不知道到哪里就溢出了。。不管怎么说该有的功能基本算是都做上了。。



按键1进入开路短路校准模式,进入后屏幕显示开路校准或者短路校准,准备好后按按键2确定进入校准,视频只演示进入方法,因为非常非常慢24个档位乘4个频率,能闭眼睡一觉,我写程序没感觉麻烦,但是感觉这校准过程也太麻烦了。

开路校准表存到0X8004000,短路存到0X8004400,匹配校准就是上个校准视频,数据会保存到0X8004800.


https://github.com/yjmwxwx/stm32asm/tree/master/gcm0/lcr_3

使用特权

评论回复
16
yjmwxwx|  楼主 | 2022-2-4 12:23 | 只看该作者
本帖最后由 yjmwxwx 于 2022-2-5 12:40 编辑



匹配校准演示

先按键按键2再同时按住按键1进入匹配校准模式,当显示确认校准后按按键1会显示进入校准,按照显示当档位根据档位表提供的校准电阻接入后,按按键1进入开始校准。



使用特权

评论回复
17
yjmwxwx|  楼主 | 2022-2-5 12:50 | 只看该作者
    Zo:仪器端子打开时的测量值。
    Zs:端子短路时的测量值。
    Zsm:连接到DUT时标准DUT的测量值
    Zstd:参考DUT的真实(或预期)值。
    Zxm:DUT的测量值。
    Zdut:DUT的校正值


zo = -6864107 - 9872402i
zs = -61 + 70i
zxm=555+81i
zsm =  555+  81i
zdut=((zs-zxm)*(zsm-zo))/((zxm-zo)*(zs-zsm))



数据表都采集好了,就这简单公式我就是写不好你说尴尬不尴尬,搞了好几天还是不行,要是一个档位还好说,档位多了不知道哪个档位计算就溢出了,缩小数据的话又会有的档位不能正确计算,这写数学库比电桥程序麻烦的多,我这定点数计算实在是写的不怎么样。

失败告终,倒在了数值计算数学库脚下 *_*!

使用特权

评论回复
18
叶春勇| | 2022-2-6 21:43 | 只看该作者
yjmwxwx 发表于 2022-2-5 12:50
数据表都采集好了,就这简单公式我就是写不好你说尴尬不尴尬,搞了好几天还是不行,要是一个档位还好说 ...

不好定点,就写浮点呀

使用特权

评论回复
19
yjmwxwx|  楼主 | 2022-2-6 22:43 | 只看该作者
本帖最后由 yjmwxwx 于 2022-2-6 22:56 编辑
叶春勇 发表于 2022-2-6 21:43
不好定点,就写浮点呀

今天又调试了下,那个公式算是能算了,原来是复数乘法计算程序里面的ATAN2前面左移15位忘记关掉引起的溢出,实验了下在校准点还是准确的,过了,偏离了就不行了,可能得这个公式前面还要做幅度和相位校准才行。别的地方那个还有问题,比如上下臂切换太快,切换会造成干扰,这个干扰也被采集了,换成采集多个周期会强很多,但是对于自动换档来说快速更新数据就快速换档,换档程序切换太快是用没滤波的数据靠右移数位来避开跳动的数据,但是还是换的太快,没等数据稳定就换了,有的档位会换不到准确的档位。
低频时候采样率又设置太低了,造成换档和测量速度很慢,还得慢慢改改。

给你看看,就为了计算这简单公式我写的程序多麻烦,把计算这个公式用到的部分贴出来看看,总算勉强能用了
复数乘法和除法都是用角度方法算的

https://elsenaju.eu/Arithmetic/division-complex-numbers.htm

复数计算.zip (2.74 KB)



atan_biao:        @角度
        .int 0x00168000,0x000D4853,0x000704A3,0x00039000,0x0001C9C5,0x0000E51B,0x00007295,0x0000394B,0x00001CA5,0x00000E52,0x00000729,0x00000394,0x000001CA,0x000000E5,0x00000072,0x00000039,0x0000001C,0x0000000E,0x00000007,0x00000003,0x00000001


__suan_atan2:
        @入口R0=实部,R1=虚部
        @出口R0=角度
        push {r2-r6,lr}
        ldr r6, = atan_biao
        movs r2, # 0
        mov r3, r2
        movs r0, r0
        bpl __panduan_xubu
        ldr r2, = 5898240
        mvns r0, r0
        mvns r1, r1
        adds r0, r0, # 1
        adds r1, r1, # 1
__panduan_xubu:
        movs r1, r1
        bpl __suan_atan2_xunhuan
        ldr r2, = 11796480
__suan_atan2_xunhuan:
        movs r1, r1
        bpl __atan2_zhengzhuan
        mov r4, r0        @x
        mov r5, r1        @y
        asrs r5, r5, r3
        asrs r4, r4, r3
        subs r0, r0, r5
        adds r1, r1, r4
        mov r4, r3
        lsls r4, r4, # 2
        ldr r4, [r6, r4]
        subs r2, r2, r4
        b __atan2_xuanzhuan
__atan2_zhengzhuan:
        mov r4, r0        @x
        mov r5, r1        @y
        asrs r5, r5, r3
        asrs r4, r4, r3
        adds r0, r0, r5
        subs r1, r1, r4
        mov r4, r3
        lsls r4, r4, # 2
        ldr r4, [r6, r4]
        adds r2, r2, r4
__atan2_xuanzhuan:
        adds r3, r3, # 1
        cmp r3, # 21
        bne __suan_atan2_xunhuan
        mov r1, r0
        mov r0,r2
        pop {r2-r6,pc}




        
__suan_cos_sin:
        @入口R0=0*32768到360*32768
        @出口R0=COS,R1=SIN
        [url=home.php?mod=space&uid=56358]@增益[/url] 32768*0.6072529350088812561694
        push {r2-r7,lr}
        ldr r1, = 0x4dba
        ldr r2, = 2949120        @90
        ldr r3, = 8847360        @270
        ldr r7, = atan_biao
        movs r5, # 0
        mov r6, r5
        cmp r0, r2
        bhi __dayu_90
        movs r4, # 0
        b __suan_cos_sin_xunhuan
__dayu_90:
        cmp r0, r3
        bhi __dayu_270
        ldr r4, = 5898240        @180
        b __suan_cos_sin_xunhuan
__dayu_270:
        ldr r4, = 11796480         @360
__suan_cos_sin_xunhuan:
        mov r3, r4
        mov r2, r0
        subs r2, r2, r3
        bmi __zhengzhuan
__fanzhuan:        
        mov r3, r6
        mov r2, r1
        asrs r6, r6, r5
        subs r2, r2, r6        @x
        asrs r1, r1, r5
        mov r6, r5
        lsls r6, r6, # 2
        ldr r6, [r7, r6]
        adds r3, r3, r1        @y
        adds r4, r4, r6        @jiaodu
        b __cordic_xuanzhuan
__zhengzhuan:
        mov r3, r6
        mov r2, r1
        asrs r6, r6, r5
        adds r2, r2, r6        @x
        asrs r1, r1, r5
        mov r6, r5
        lsls r6, r6, # 2
        ldr r6, [r7, r6]
        subs r3, r3, r1        @y
        subs r4, r4, r6        @jiaodu
__cordic_xuanzhuan:
        mov r1, r2
        mov r6, r3
        adds r5, r5, # 1
        cmp r5, # 21
        bne __suan_cos_sin_xunhuan
        ldr r6, = 2949120        @90
        ldr r7, = 8847360      @270
        cmp r0, r6
        bls __suan_cos_sin_fanhui
        cmp r0, r7
        bcs __suan_cos_sin_fanhui
        mvns r2, r2
        mvns r3, r3
        adds r2, r2, # 1
        adds r3, r3, # 1
__suan_cos_sin_fanhui:        
        mov r1, r3
        mov r0, r2
        pop {r2-r7,pc}

__ji_suan_fu_du:            [url=home.php?mod=space&uid=72445]@[/url] 计算幅度
        [url=home.php?mod=space&uid=72445]@[/url] 入r0= 实部,r1= 虚部
        @ 出r0 = 幅度
        @ Mag ~=Alpha * max(|I|, |Q|) + Beta * min(|I|, |Q|)
        @ Alpha * Max + Beta * Min
        push {r1-r4,lr}
        movs r0, r0
        bpl _shibubushifushu
        mvns r0, r0                             @ 是负数转成正数
        adds r0, r0, # 1
_shibubushifushu:                                       @ 实部不是负数
        movs r1, r1
        bpl _xububushifushu
        mvns r1, r1                             @ 是负数转成正数
        adds r1, r1, # 1
_xububushifushu:                                        @ 虚部不是负数
        cmp r0, # 0
        bne _panduanxubushibushi0
        mov r0, r1
        pop {r1-r4,pc}
_panduanxubushibushi0:
        cmp r1, # 0
        bne _jisuanfudu1
        pop {r1-r4,pc}
_jisuanfudu1:
        ldr r2, = 31066                @ Alpha q15 0.948059448969 @
        ldr r3, = 12868                @ Beta q15 0.392699081699
        cmp r1, r0
        bhi _alpha_min_beta_max
_alpha_max_beta_min:
        mov r4, r1
        mov r1, r2
        bl __chengfa
        lsls r0, r0, # 17
        lsrs r1, r1, # 15
        orrs r0, r0, r1
        mov r2, r0

        mov r0, r3
        mov r1, r4
        bl __chengfa
        lsls r0, r0, # 17
        lsrs r1, r1, # 15
        orrs r1, r1, r0
        mov r0, r2
        
@        muls r0, r0, r2
@        muls r1, r1, r3
@        asrs r0, r0, # 15
@        asrs r1, r1, # 15
        adds r0, r0, r1
        movs r1, # 1
        pop {r1-r4,pc}
_alpha_min_beta_max:
        mov r4, r1
        mov r1, r3
        bl __chengfa
        lsls r0, r0, # 17
        lsrs r1, r1, # 15
        orrs r0, r0, r1
        mov r3, r0

        mov r0, r2
        mov r1, r4
        bl __chengfa
        lsls r0, r0, # 17
        lsrs r1, r1, # 15
        orrs r1, r1, r0
        mov r0, r3
               
@        muls r0, r0, r3
@        muls r1, r1, r2
@        asrs r0, r0, # 15
@        asrs r1, r1, # 15
        adds r0, r0, r1
        movs r1, # 0
        pop {r1-r4,pc}

__chufa64:
        @64位除32位
        @ (R0=高32位R1=低32位)除(R2)= (R0高32)(R1低32)
        push {r3-r7,lr}
        cmp r2, # 0
        beq __chu_fa64_fan_hui0
        cmp r1, # 0
        bne __chu_fa64_ji_suan
        cmp r0, # 0
        beq __chu_fa64_fan_hui0
__chu_fa64_ji_suan:
        movs r4, # 0
        mov r7, r4
        mov r3, r4
        mov r5, r4
        movs r6, # 1
        lsls r6, r6, # 31
__chu_fa64_xun_huan:
        lsls r1, r1, # 1
        adcs r0, r0, r0
        adcs r4, r4, r4
        cmp r4, r2
        bcc __chu_fa_yi_wei
        adds r3, r3, r6
        adcs r5, r5, r7
        subs r4, r4, r2
__chu_fa_yi_wei:
        movs r6, r6
        beq __di_yi_wei
        lsrs r6, r6, # 1        @高32位移位
        bne __chu_fa64_xun_huan
        movs r7, # 1
        lsls r7, r7, # 31
        b __chu_fa64_xun_huan
__di_yi_wei:                    @低32位移位
        lsrs r7, r7, # 1
        bne __chu_fa64_xun_huan
        mov r0, r3
        mov r1, r5
        pop {r3-r7,pc}
__chu_fa64_fan_hui0:
        movs r0, # 0
        movs r1, # 0
        pop {r3-r7,pc}
__chengfa:
        @入R0 乘以 R1
        @出 R0高32 , R1低32
        @0xffffffff*0xffffffff
        [url=home.php?mod=space&uid=26072]@4[/url]        F F F E 0 0 0 1                       @4
        @3                F F F E 0 0 0 1               @3
        @2                F F F E 0 0 0 1               @2
        [url=home.php?mod=space&uid=2514798]@1[/url]                        F F F E 0 0 0 1       @1
        @         F F F F F F F E 0 0 0 0 0 0 0 1
        push {r2-r7,lr}
        cmp r0, # 0
        beq __cheng_fa_fan_hui
        cmp r1, # 0
        beq __cheng_fa_fan_hui
__ji_suan_cheng_fa:
        mov r2, r0
        mov r3, r1
        lsrs r0, r0, # 16       @高16
        lsls r2, r2, # 16       @ 低16
        lsrs r2, r2, # 16
        lsrs r1, r1, # 16       @高16
        lsls r3, r3, # 16       @低16
        lsrs r3, r3, # 16
        mov r4, r2
        mov r5, r0
        muls r2, r2, r3         @1
        muls r0, r0, r3         @2
        muls r4, r4, r1         @3
        muls r5, r5, r1         @4
        mov r6, r0
        mov r7, r4
        lsls r0, r0, # 16       @2低32
        lsls r4, r4, # 16       @3低32
        lsrs r6, r6, # 16       @2高32
        lsrs r7, r7, # 16       @3高32
        movs r1, # 0
        adds r2, r2, r0         @低32
        adcs r6, r6, r1         @高32
        adds r2, r2, r4
        adcs r6, r6, r7
        adds r6, r6, r5
        mov r0, r6
        mov r1, r2
        pop {r2-r7,pc}
__cheng_fa_fan_hui:
        movs r0, # 0
        movs r1, # 0
        pop {r2-r7,pc}


__fushu_chufa:
        @入口R0=Z1_R, R1=Z1_I,R2=Z2_R,R3=Z2_I
        @出口R0=Z_R,R1=Z_I
        push {r4-r7,lr}
        mov r6, r0
        mov r7, r1
@        lsls r0, r0, # 15
@        lsls r1, r1, # 15
        bl __suan_atan2
        mov r5, r0
        mov r0, r2
        mov r1, r3
@        lsls r0, r0, # 15
@        lsls r1, r1, # 15
        bl __suan_atan2
@        bkpt # 0
        mov r1, r5
        subs r0, r1, r0 @算角度差
        bpl __suan_shangxiabi_fudu
        ldr r1, = 11796480      @360*32768
        adds r0, r0, r1
__suan_shangxiabi_fudu:
        mov r5, r0      @保存角度差
@        bkpt # 1
        mov r0, r2
        mov r1, r3
        bl __ji_suan_fu_du
@        bkpt # 2
        mov r2, r0
        mov r0, r6      @上臂R
        mov r1, r7      @上臂I
        bl __ji_suan_fu_du
@        bkpt # 3
        mov r1, r0
        lsrs r0, r0, # 17
        lsls r1, r1, # 15
        bl __chufa64
        mov r3, r1      @Z幅度
@        bkpt # 4
        mov r0, r5
        bl __suan_cos_sin
@        bkpt # 4
        mov r4, r1
        mov r1, r3
        movs r2, # 0
        movs r0, r0
        bpl cl1
        adds r2, r2, # 1
        mvns r0, r0
        adds r0, r0, # 1
cl1:
        movs r1, r1
        bpl cl2
        adds r2, r2, # 1
        mvns r1, r1
        adds r1, r1, # 1
cl2:
        bl __chengfa
@        bkpt # 5
        lsls r0, r0, # 17
        lsrs r1, r1, # 15
        orrs r1, r1, r0
        cmp r2, # 1
        bne __suan_xubu
        mvns r1, r1
        adds r1, r1, # 1
__suan_xubu:
        mov r0, r4
        mov r4, r1      @实部
        mov r1, r3
        movs r2, # 0
        movs r0, r0
        bpl cl3
        adds r2, r2, # 1
        mvns r0, r0
        adds r0, r0, # 1
cl3:
        movs r1, r1
        bpl cl4
        adds r2, r2, # 1
        mvns r1, r1
        adds r1, r1, # 1
cl4:
        bl __chengfa
@        bkpt #6
        lsls r0, r0, # 17
        lsrs r1, r1, # 15
        orrs r1, r1, r0
        cmp r2, # 1
        bne cl5
        mvns r1, r1
        adds r1, r1, # 1
cl5:
        mov r0, r4
        pop {r4-r7,pc}

__fushu_chengfa:
        @入口R0=Z1_R, R1=Z1_I,R2=Z2_R,R3=Z2_I
        @出口R0=Z_R,R1=Z_I
        push {r4-r7,lr}
        mov r6, r0
        mov r7, r1
@        lsls r0, r0, # 15
@        lsls r1, r1, # 15
        bl __suan_atan2
        mov r5, r0
        mov r0, r2
        mov r1, r3
@        lsls r0, r0, # 15
@        lsls r1, r1, # 15
        bl __suan_atan2
@        bkpt # 0
        mov r1, r5
        adds r0, r1, r0 @算角度差
        ldr r1, = 11796480      @360*32768
        cmp r0, r1
        bcc __suan_chengfa_shangxiabi_fudu
        subs r0, r0, r1
__suan_chengfa_shangxiabi_fudu:
        mov r5, r0      @保存角度和
@      bkpt # 1
        mov r0, r2
        mov r1, r3
        bl __ji_suan_fu_du
@       bkpt # 2
        mov r2, r0
        mov r0, r6      @上臂R
        mov r1, r7      @上臂I
        bl __ji_suan_fu_du
@        bkpt # 3
        mov r1, r2
        bl __chengfa
        lsls r0, r0, # 17
        lsrs r1, r1, # 15
        orrs r0, r0, r1
        mov r3, r0      @Z幅度
@        bkpt # 4
        mov r0, r5
        bl __suan_cos_sin
@      bkpt # 4
        mov r4, r1
        mov r1, r3
        movs r2, # 0
        movs r0, r0
        bpl cf1
        adds r2, r2, # 1
        mvns r0, r0
        adds r0, r0, # 1
cf1:
        movs r1, r1
        bpl cf2
        adds r2, r2, # 1
        mvns r1, r1
        adds r1, r1, # 1
cf2:
        bl __chengfa
@       bkpt # 5
        lsls r0, r0, # 17
        lsrs r1, r1, # 15
        orrs r1, r1, r0
        cmp r2, # 1
        bne __suan_chengfa_xubu
        mvns r1, r1
        adds r1, r1, # 1
__suan_chengfa_xubu:
        mov r0, r4
        mov r4, r1      @实部
        mov r1, r3
        movs r2, # 0
        movs r0, r0
        bpl cf3
        adds r2, r2, # 1
        mvns r0, r0
        adds r0, r0, # 1
cf3:
        movs r1, r1
        bpl cf4
        adds r2, r2, # 1
        mvns r1, r1
        adds r1, r1, # 1
cf4:
        bl __chengfa
@       bkpt #6
        lsls r0, r0, # 17
        lsrs r1, r1, # 15
        orrs r1, r1, r0
        cmp r2, # 1
        bne cf5
        mvns r1, r1
        adds r1, r1, # 1
cf5:
        mov r0, r4
        pop {r4-r7,pc}
        .ltorg
__fu_shu_cheng_fa:
        push {r4-r7,lr}
        @r0=a,r1=b,r2=c,r3=d
        mov r4, r0      @a
        mov r5, r1      @b
        mov r6, r2      @c
        mov r7, r3      @d
        muls r0, r0, r2 @a*c
        muls r1, r1, r3 @b*d
        subs r0, r0, r1 @ac-bd
        muls r4, r4, r7 @a*d
        muls r5, r5, r6 @b*c
        adds r4, r4, r5 @ad+bc
        mov r1, r4
        pop {r4-r7,pc}
        .ltorg
__osm_jiaozhun:
        @入口R0-R1=ZS,R2-R3=ZXM,R4-R5=ZSM,R6-R7=ZO
        @出口R0=R,R1=I
        push {r2-r7,lr}
        mov r4, r8
        mov r5, r9
        mov r6, r10
        mov r7, r11
        push {r4-r7}
        @       ldr r0, = -61           @zs
        @       ldr r1, = 70
        @       ldr r2, = 555           @zxm
        @       ldr r3, = 81
        @       ldr r4, = 555           @zsm
        @       ldr r5, = 81
        @       ldr r6, = -6864107      @zo
        @       ldr r7, = -9872402
        mov r8, sp
        ldr r0, = 0x200000e0
        mov sp, r0
        pop {r0-r7}
        mov sp, r8
        mov r8, r0
        mov r9, r1
        subs r0, r0, r2         @zs-zxm
        subs r1, r1, r3
        mov r10, r0
        mov r11, r1

        mov r0, r8
        mov r1, r9
        subs r0, r0, r4         @zs-zsm
        subs r1, r1, r5

        subs r2, r2, r6         @zxm-zo
        subs r3, r3, r7

        subs r4, r4, r6         @zsm-zo
        subs r5, r5, r7

        
        asrs r0, r0, # 4
        asrs r1, r1, # 4
        asrs r2, r2, # 4
        asrs r3, r3, # 4
        
        bl __fushu_chengfa    @(zxm-zo)*(zs-zsm)
        mov r2, r4
        mov r3, r5

        mov r4, r0
        mov r5, r1

        mov r0, r10
        mov r1, r11
        asrs r0, r0, # 4
        asrs r1, r1, # 4
        asrs r2, r2, # 4
        asrs r3, r3, # 4
        
        
        bl __fushu_chengfa    @(zs-zxm)*(zsm-zo)

        mov r2, r4
        mov r3, r5
        
        bl __fushu_chufa
        pop {r4-r7}
        mov r8, r4
        mov r9, r5
        mov r10, r6
        mov r11, r7
        pop {r2-r7,pc}

















使用特权

评论回复
20
yjmwxwx|  楼主 | 2022-2-6 22:50 | 只看该作者
叶春勇 发表于 2022-2-6 21:43
不好定点,就写浮点呀

浮点的虽然以前学过但是没写过运算的程序,调用官方提供的数学库也行,但是自己DIY折腾可玩性高,不成功才有继续下去的动力,要是一下成功了估计再也不会碰了这个了,速度要求快的地方还是定点的快,我实验了下MCU频率56MHZ的时候1000点DFT计算376微秒就够了,采样率2MHZ采集100KHZ能在采集完数据前计算完。
还是牺牲空间换速度,尽量少用循环

快速DFT,2MHZ采集100KHZ.zip (829 Bytes)


cos_sin_biao_100k:
        .int 0x00008000,0x00000000,0x0000678D,0xFFFFB4C4,0x0000278D,0xFFFF8644,0xFFFFD873,0xFFFF8644,0xFFFF9873,0xFFFFB4C4,0xFFFF8000,0x00000000,0xFFFF9873,0x00004B3C,0xFFFFD873,0x000079BC,0x0000278D,0x000079BC,0x0000678D,0x00004B3C,0x00008000,0x00000000,0x0000678D,0xFFFFB4C4,0x0000278D,0xFFFF8644,0xFFFFD873,0xFFFF8644,0xFFFF9873,0xFFFFB4C4,0xFFFF8000,0x00000000,0xFFFF9873,0x00004B3C,0xFFFFD873,0x000079BC,0x0000278D,0x000079BC,0x0000678D,0x00004B3C,0x12345678
       

__dft1:                @1000点用时376微秒
        push {r2-r7,lr}
        mov r5, r10
        mov r6, r11
        mov r7, r12
        push {r3-r5}
        ldr r0, = cossin
        ldr r1, = dianyabiao
        ldr r0, [r0]
        movs r6, # 0
        mov r7, r6
        mov r12, sp
        mov r11, r0
        mov r10, r1
        b __ji_suan_dft
        .ltorg
__ji_suan_dft:
        @0
        mov sp, r11
        pop {r0-r3}
        mov r11, sp
        mov sp, r10
        pop {r4}
        mov r10, sp
        mov r5, r4
        lsls r4, r4, # 16
        lsrs r4, r4, # 16
        lsrs r5, r5, # 16
        muls r0, r0, r4                @R
        muls r1, r1, r4                @I
        muls r2, r2, r5                @R
        muls r3, r3, r5                @I
        asrs r0, r0, # 6
        asrs r1, r1, # 6
        asrs r2, r2, # 6
        asrs r3, r3, # 6
        adds r0, r0, r2         @r
        adds r1, r1, r3         @i
        adds r6, r6, r0
        adds r7, r7, r1

        mov sp, r11
        pop {r0-r3}
        mov r11, sp
        mov sp, r10
        pop {r4}
        mov r10, sp
        mov r5, r4
        lsls r4, r4, # 16
        lsrs r4, r4, # 16
        lsrs r5, r5, # 16
        muls r0, r0, r4
        muls r1, r1, r4
        muls r2, r2, r5
        muls r3, r3, r5
        asrs r0, r0, # 6
        asrs r1, r1, # 6
        asrs r2, r2, # 6
        asrs r3, r3, # 6
        adds r0, r0, r2         @r
        adds r1, r1, r3         @i
        adds r6, r6, r0
        adds r7, r7, r1

        mov sp, r11
        pop {r0-r3}
        mov r11, sp
        mov sp, r10
        pop {r4}
        mov r10, sp
        mov r5, r4
        lsls r4, r4, # 16
        lsrs r4, r4, # 16
        lsrs r5, r5, # 16
        muls r0, r0, r4
        muls r1, r1, r4
        muls r2, r2, r5
        muls r3, r3, r5
        asrs r0, r0, # 6
        asrs r1, r1, # 6
        asrs r2, r2, # 6
        asrs r3, r3, # 6
        adds r0, r0, r2  @r
        adds r1, r1, r3  @i
        adds r6, r6, r0
        adds r7, r7, r1

        mov sp, r11
        pop {r0-r3}
        mov r11, sp
        mov sp, r10
        pop {r4}
        mov r10, sp
        mov r5, r4
        lsls r4, r4, # 16
        lsrs r4, r4, # 16
        lsrs r5, r5, # 16
        muls r0, r0, r4
        muls r1, r1, r4
        muls r2, r2, r5
        muls r3, r3, r5
        asrs r0, r0, # 6
        asrs r1, r1, # 6
        asrs r2, r2, # 6
        asrs r3, r3, # 6
        adds r0, r0, r2         @r
        adds r1, r1, r3         @i
        adds r6, r6, r0
        adds r7, r7, r1
        @1
__dft1_fanhuile:
        mov sp, r11
        pop {r0-r3}
        mov r11, sp
        mov sp, r10
        pop {r4}
        mov r10, sp
        mov r5, r4
        lsls r4, r4, # 16
        lsrs r4, r4, # 16
        lsrs r5, r5, # 16
        muls r0, r0, r4         @R
        muls r1, r1, r4         @I
        muls r2, r2, r5         @R
        muls r3, r3, r5         @I
        asrs r0, r0, # 6
        asrs r1, r1, # 6
        asrs r2, r2, # 6
        asrs r3, r3, # 6
        adds r0, r0, r2  @r
        adds r1, r1, r3  @i
        adds r6, r6, r0
        adds r7, r7, r1

        mov sp, r11
        pop {r0-r3}
        mov r11, sp
        mov sp, r10
        pop {r4}
        mov r10, sp
        mov r5, r4
        lsls r4, r4, # 16
        lsrs r4, r4, # 16
        lsrs r5, r5, # 16
        muls r0, r0, r4
        muls r1, r1, r4
        muls r2, r2, r5
        muls r3, r3, r5
        asrs r0, r0, # 6
        asrs r1, r1, # 6
        asrs r2, r2, # 6
        asrs r3, r3, # 6
        adds r0, r0, r2         @r
        adds r1, r1, r3         @i
        adds r6, r6, r0
        adds r7, r7, r1

        mov sp, r11
        pop {r0-r3}
        mov r11, sp
        mov sp, r10
        pop {r4}
        mov r10, sp
        mov r5, r4
        lsls r4, r4, # 16
        lsrs r4, r4, # 16
        lsrs r5, r5, # 16
        muls r0, r0, r4
        muls r1, r1, r4
        muls r2, r2, r5
        muls r3, r3, r5
        asrs r0, r0, # 6
        asrs r1, r1, # 6
        asrs r2, r2, # 6
        asrs r3, r3, # 6
        adds r0, r0, r2  @r
        adds r1, r1, r3  @i
        adds r6, r6, r0
        adds r7, r7, r1

        mov sp, r11
        pop {r0-r3}
        mov r11, sp
        mov sp, r10
        pop {r4}
        mov r10, sp
        mov r5, r4
        lsls r4, r4, # 16
        lsrs r4, r4, # 16
        lsrs r5, r5, # 16
        muls r0, r0, r4
        muls r1, r1, r4
        muls r2, r2, r5
        muls r3, r3, r5
        asrs r0, r0, # 6
        asrs r1, r1, # 6
        asrs r2, r2, # 6
        asrs r3, r3, # 6
        adds r0, r0, r2         @r
        adds r1, r1, r3         @i
        adds r6, r6, r0
        adds r7, r7, r1
        @2
        mov sp, r11
        pop {r0-r3}
        mov r11, sp
        mov sp, r10
        pop {r4}
        mov r10, sp
        mov r5, r4
        lsls r4, r4, # 16
        lsrs r4, r4, # 16
        lsrs r5, r5, # 16
        muls r0, r0, r4         @R
        muls r1, r1, r4         @I
        muls r2, r2, r5         @R
        muls r3, r3, r5         @I
        asrs r0, r0, # 6
        asrs r1, r1, # 6
        asrs r2, r2, # 6
        asrs r3, r3, # 6
        adds r0, r0, r2  @r
        adds r1, r1, r3  @i
        adds r6, r6, r0
        adds r7, r7, r1

        mov sp, r11
        pop {r0-r3}
        mov r11, sp
        mov sp, r10
        pop {r4}
        mov r10, sp
        mov r5, r4
        lsls r4, r4, # 16
        lsrs r4, r4, # 16
        lsrs r5, r5, # 16
        muls r0, r0, r4
        muls r1, r1, r4
        muls r2, r2, r5
        muls r3, r3, r5
        asrs r0, r0, # 6
        asrs r1, r1, # 6
        asrs r2, r2, # 6
        asrs r3, r3, # 6
        adds r0, r0, r2         @r
        adds r1, r1, r3         @i
        adds r6, r6, r0
        adds r7, r7, r1

        ldr r1, = cossin
        ldr r1, [r1]
        mov r11, r1
__panduan_dianyabiao:
        ldr r0, = 0x200007b8
        cmp r10, r0
        bcs __dft1_fanhui
        b __ji_suan_dft
__dft1_fanhui:
        ldr r0, = 0x200007d0
        cmp r10, r0
        beq __dft1_fanhui1
        b __dft1_fanhuile
__dft1_fanhui1:
        mov r0, r6
        mov r1, r7
        asrs r0, r0, # 9
        asrs r1, r1, # 9
        mov sp, r12
        pop {r2-r4}
        mov r10, r2
        mov r11, r3
        mov r12, r4
        pop {r2-r7,pc}
        .ltorg


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

117

主题

2707

帖子

47

粉丝