发新帖我要提问
12
返回列表
打印

最近做了个ADC采电压的手工小制作又失败了

[复制链接]
楼主: yjmwxwx
手机看帖
扫描二维码
随时随地手机跟帖
21
yjmwxwx 发表于 2021-3-16 14:27
是用的移动平均,FIR那个试了下发现相位抖动就没用,我写的移动平均程序好像比较笨,老实的做了256次加法 ...

你的移动平均的效率太低了,不是这么算的。
FIR滤波器,才不得不这么算

使用特权

评论回复
22
yjmwxwx|  楼主 | 2021-3-16 16:03 | 只看该作者
叶春勇 发表于 2021-3-16 15:15
你的移动平均的效率太低了,不是这么算的。
FIR滤波器,才不得不这么算

确实效率低,每次都要算256次加法,看你这么说我才知道,这种别人都是怎么写的?

使用特权

评论回复
23
叶春勇| | 2021-3-16 16:59 | 只看该作者
yjmwxwx 发表于 2021-3-16 16:03
确实效率低,每次都要算256次加法,看你这么说我才知道,这种别人都是怎么写的? ...

你的理解没错,移动平均也是fir滤波器,但是移动平均,系数相同,可以优化
sum1=a[4]+a[3]+a[2]+a[1]+a[0]
sum2=a[5]+a[4]+a[3]+a[2]+a[1]
这种可以优化
sum2=a[5]+sum1-a[0]
你256个,也是同理。fir一般情形滤波器就不能了。

使用特权

评论回复
24
yjmwxwx|  楼主 | 2021-3-16 17:15 | 只看该作者
叶春勇 发表于 2021-3-16 16:59
你的理解没错,移动平均也是fir滤波器,但是移动平均,系数相同,可以优化
sum1=a[4]+a[3]+a[2]+a[1]+a[0 ...

我脑袋有点反应不过来,优化下只做一个加法和一个减法还不用占内存了么? 有没有完整的程序?

使用特权

评论回复
25
yjmwxwx|  楼主 | 2021-3-16 18:53 | 只看该作者
本帖最后由 yjmwxwx 于 2021-3-16 18:55 编辑
叶春勇 发表于 2021-3-16 16:59
你的理解没错,移动平均也是fir滤波器,但是移动平均,系数相同,可以优化
sum1=a[4]+a[3]+a[2]+a[1]+a[0 ...

谢谢你了,你都说的这么明白了我还看不懂,已经改过来了,比原来效率高太多了,以前只是看着书上的FIR算法写的,没想到还能优化,脑子不怎么灵活。。。
看样子一个人闭门造车不太行,这么大错误都发现不了,别的地方肯定还有更多错误。。

__lv_bo_qi:
        @地址顺序:指针,累加值,缓冲区
        @入口R0=缓冲区,R1=数据, r2,=指针
        @出口R0
        push {r3-r6,lr}
        movs r4, # 4
        ldr r5, [r2]
        mov r3, r5
        lsls r3, r5, # 2
        ldr r6, [r0, r3]
        str r1, [r0, r3]
        adds r5, r5, # 1
        str r5, [r2]
        cmp r5, r4
        bne __huanchong_leijia1
        movs r5, # 0
        str r5, [r2]
__huanchong_leijia1:
        subs r0, r0, # 4
        ldr r5, [r0]
        adds r1, r1, r5
        subs r1, r1, r6
        str r1, [r0]
        asrs r0, r1, # 2
        pop {r3-r6,pc}


使用特权

评论回复
26
yjmwxwx|  楼主 | 2021-3-16 21:21 | 只看该作者
叶春勇 发表于 2021-3-16 20:07
我还得向你学下汇编,你说你会点c语言

adc值存在r0中

谢谢你帮我 写的完整的程序,我知道你想告诉我不要再用汇编写程序了,其实我写的汇编很差,肯定不如编译器效率高。你这个算法效率真高,决定成败的算法,我那样写效率太低了,真的笨死了。就这样简单一个程序,汇编写也很蛋疼,真不如C语言方便,不过我性格比较怪,有宽敞平坦的公路我不走,就喜欢爬山过坑,不然感觉没意思。

while:
        ldr r0, = adc
        ldr r5, = n
        ldr r0, [r0]
        ldr r4, = q
        ldrb r6, [r5]
        lsls r6, r6, # 2
        ldr r7, [r4, r6]
        str r0, [r4, r6]
        subs r0, r0, r7
        ldr r4, = sum
        lsrs r6, r6, # 2
        ldr r7, [r4]
        adds r6, r6, # 1
        adds r7, r7, r0
        str r7, [r4]
        strb r6, [r5]
        ldr r6, = v
        asrs r7, r7, # 8
        str r7, [r6]
        b while




使用特权

评论回复
27
叶春勇| | 2021-3-16 23:51 | 只看该作者
yjmwxwx 发表于 2021-3-16 21:21
谢谢你帮我 写的完整的程序,我知道你想告诉我不要再用汇编写程序了,其实我写的汇编很差,肯定不如编译 ...

不用多想,我没那么喜欢做传销。己所不欲,勿施于人。我也是没事看了以下你的程序。你的除法代码也挺长的。我再看看。

使用特权

评论回复
28
yjmwxwx|  楼主 | 2021-3-17 10:17 | 只看该作者
叶春勇 发表于 2021-3-16 23:51
不用多想,我没那么喜欢做传销。己所不欲,勿施于人。我也是没事看了以下你的程序。你的除法代码也挺长的 ...

我写的程序都很差的,也就勉强能运行不跑飞。

使用特权

评论回复
29
yjmwxwx|  楼主 | 2021-3-17 10:20 | 只看该作者
king5555 发表于 2021-3-17 08:46
都是高手。汇编不好写,但有个优点胜过别个,佔用单片机內部记亿体较少。 ...

你看叶春勇的算法比我原来快上百倍,所以语言不重要关键还是算法。现在汇编已经淘汰了,也就岁数大学不会新编程语言的才用。

使用特权

评论回复
30
叶春勇| | 2021-3-17 17:09 | 只看该作者
yjmwxwx 发表于 2021-3-17 10:20
你看叶春勇的算法比我原来快上百倍,所以语言不重要关键还是算法。现在汇编已经淘汰了,也就岁数大学不会 ...

汇编语言不会淘汰的,任何高级语言都是汇编语言的语法糖。
主要是开发效率。用python开发效率极高,做调包侠,c语言也就比汇编稍微好点。也是比较手动了,各种数据结构都得自己定义。
今天看了一下,宏汇编,gcc-as的格式是这样
.macro ldm reg,mem @reg<-mem
ldr reg,=\mem
ldr reg,[reg]
.endm

.macro incm mem @n=n+1
ldm r0,\mem
adds r1,r0,#1
str r1,[r0]
.endm

.macro movm smem,dmem @dmem=smem
ldm r0,\smem
ldr r1,=\dmem
str r0,r[1]
.endm
你看看有没有问题。

使用特权

评论回复
31
yjmwxwx|  楼主 | 2021-3-17 18:38 | 只看该作者
叶春勇 发表于 2021-3-17 17:09
汇编语言不会淘汰的,任何高级语言都是汇编语言的语法糖。
主要是开发效率。用python开发效率极高,做调 ...

这个我也不知道怎么用,我只用过一次宏汇编,现在都忘记怎么用了。
最好还是看官方手册,下载个编译器试下就知道了,我不想学宏汇编怎么用。
https://www.sourceware.org/binutils/docs/as/Macro.html

以前只试验过一次,现在我都看不懂是什么意思了。。。

        .macro  空操作
        .short   0x0000
        .endm

        .macro  A到B
        .short   0x2100
        .endm

        .macro 立即数到A t:vararg
        .short   0x100\t
        .endm

        .macro  A加B
        .short   0x1700
        .endm
        
        .macro  A减B
        .short   0x1800
        .endm
        
        .macro  无条件转移
        .short   0x0b00
        .endm
        
        .macro  为零转移
        .short   0x0c00
        .endm
        
        .macro  不为零转移
        .short   0x0d00
        .endm
        
        .macro  A到RAM
        .short   0x7100
        .endm
        .macro  RAM到A
        .short   0x1a00
        .endm

.section .text               
        立即数到A t=5
        A到B
        A到RAM
        A减B
        不为零转移


使用特权

评论回复
32
叶春勇| | 2021-3-17 18:46 | 只看该作者
yjmwxwx 发表于 2021-3-17 18:38
这个我也不知道怎么用,我只用过一次宏汇编,现在都忘记怎么用了。
最好还是看官方手册,下载个编译器试 ...

汇编中有常用套路,固化下来,写代码效率高很多,你这种汉化,提高不了写代码的速度。

使用特权

评论回复
33
yjmwxwx|  楼主 | 2021-3-17 19:05 | 只看该作者
叶春勇 发表于 2021-3-17 18:46
汇编中有常用套路,固化下来,写代码效率高很多,你这种汉化,提高不了写代码的速度。 ...

以前有人要搞个汉字写程序于是就试验了下,可能专业写汇编的也用宏写,这个等于又封装了一层,我现在主要问题感觉不懂别人算法怎么实现的,只要懂写还是能写出来,不懂算法怎么实现的就是用C语言也不知道怎么写。

我一开学汇编就是从一个老外网站上学的,这个老外写的程序就用的宏汇编,但是我没学他这个写法。
http://pygmy.utoh.org/riscy/cortex/

riscypygness-stm32-20110310.zip (81.31 KB)

使用特权

评论回复
34
叶春勇| | 2021-3-17 19:20 | 只看该作者
yjmwxwx 发表于 2021-3-17 19:05
以前有人要搞个汉字写程序于是就试验了下,可能专业写汇编的也用宏写,这个等于又封装了一层,我现在主要 ...

我找到以前写的除法程序,没优化和查错的。
我手机装了linux,arm-none-eabi-gcc我装了,不过不准备深入研究汇编,c里可以内联汇编。还装了matlab开源版

使用特权

评论回复
35
叶春勇| | 2021-3-17 19:32 | 只看该作者
yjmwxwx 发表于 2021-3-17 19:05
以前有人要搞个汉字写程序于是就试验了下,可能专业写汇编的也用宏写,这个等于又封装了一层,我现在主要 ...

实现了forth,堆栈语言,工控里的plc指令也是堆栈的,现在没研究了。
宏汇编可以把高级语言的常用特性实现,提高写代码的效率。
学算法还是要高级语言,理解算法后,转成c语言或汇编,要会一种库比较多的脚本语言

使用特权

评论回复
36
yjmwxwx|  楼主 | 2021-3-17 20:41 | 只看该作者
叶春勇 发表于 2021-3-17 19:20
我找到以前写的除法程序,没优化和查错的。
我手机装了linux,arm-none-eabi-gcc我装了,不过不准备深入 ...

我那个除法程序是直接抄书上的不是我自己写的,他那个程序就是移位相减。

使用特权

评论回复
37
yjmwxwx|  楼主 | 2021-3-17 20:47 | 只看该作者
叶春勇 发表于 2021-3-17 19:32
实现了forth,堆栈语言,工控里的plc指令也是堆栈的,现在没研究了。
宏汇编可以把高级语言的常用特性实 ...

谢谢你浪费时间想想帮助我给我指条正确的路,我比较固执的,一条路走到黑,我搞的都是一些简单的程序,用不到复杂的算法,最近想学控制上的一些知识才下载了个octave用来计算,现在还不怎么会用。

使用特权

评论回复
38
叶春勇| | 2021-3-17 21:00 | 只看该作者
yjmwxwx 发表于 2021-3-17 20:47
谢谢你浪费时间想想帮助我给我指条正确的路,我比较固执的,一条路走到黑,我搞的都是一些简单的程序,用 ...

帮不上忙了,就帮你顶到这了。

使用特权

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

本版积分规则