六个核桃测小麦湿度
本帖最后由 yjmwxwx 于 2019-5-28 08:59 编辑快收小麦了,晒干了的小麦要靠牙咬判断干湿,想DIY个测湿度的,于是用六个核桃的铁皮瓶子做了一个简单测湿度的表,我小学文化不懂理论和计算,好像是差分电容原理,程序是以前做别的用的程序,稍微该了一下用在了这里,单片机型号STM32F030F4P6。
演示视频,测量三种不同湿度的小麦,第一种是家里粮食袋子里面的,第二种是用水泡了一下晒的不干,第三种是粮食袋子里面的放在太阳下晒了两个小时,我不是专业电工,就是农民种地的喜欢DIY,所以非常不专业,非常简单的原理验证,没有实际应用价值,没有校准和温度补偿,还是个音频范围的,外国的产品都是149M的。
视频可以看到1602下面一行xiaomai后面的数是ADC采到的,数越大小麦越湿。
http://player.youku.com/player.php/sid/XNDE5ODU1MzgzMg==/v.swf
电路图是先焊接后画的,没怎么画过,也不会设计电路,不确定有没有问题。
程序
@@单片机stm32f030f4p6
@@电容小麦水分测量
@作者:yjmwxwx
@时间:2019-05-26
@编译器:ARM-NONE-EABI-AS
.thumb
.syntax unified
.section .data
zheng_xian_biao:
.short 0x30,0x33,0x36,0x38,0x3b,0x3e,0x41,0x44,0x47,0x49,0x4c,0x4e,0x50,0x52,0x54,0x56,0x58,0x59,0x5b,0x5c,0x5d,0x5e,0x5e,0x5f,0x5f,0x5f,0x5f,0x5f,0x5e,0x5d,0x5c,0x5b,0x5a,0x59,0x57,0x55,0x53,0x51,0x4f,0x4d,0x4a,0x48,0x45,0x43,0x40,0x3d,0x3a,0x37,0x34,0x31,0x2e,0x2b,0x28,0x25,0x22,0x1f,0x1c,0x1a,0x17,0x15,0x12,0x10,0xe,0xc,0xa,0x8,0x6,0x5,0x4,0x3,0x2,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x3,0x4,0x6,0x7,0x9,0xb,0xd,0xf,0x11,0x13,0x16,0x18,0x1b,0x1e,0x21,0x24,0x27,0x29,0x2c,0x30
lcdshuju:
.ascii"yjmwxwx-20190526"
dianhua:
.ascii " 15552208295"
qq:
.ascii " QQ:3341656346"
xiaomai:
.ascii "xiaomai ="
.equ STACKINIT, 0x20001000
.equ asciimabiao, 0x20000000
.equ jishu, 0x20000010
.equ lvbozhizhen, 0x20000020
.equ lvbohuanchong, 0x20000024
.equ adccaiyang, 0x20000100
.section .text
vectors:
.word STACKINIT
.word _start + 1
.word _nmi_handler + 1
.word _hard_fault+ 1
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word _svc_handler +1
.word 0
.word 0
.word _pendsv_handler +1
.word _systickzhongduan +1 @ 15
.word aaa +1 @ _wwdg +1 @ 0
.word aaa +1 @_pvd +1 @ 1
.word aaa +1 @_rtc +1 @ 2
.word aaa +1 @_flash +1 @ 3
.word aaa +1 @ _rcc + 1 @ 4
.word aaa +1 @_exti0_1+1 @ 5
.word aaa +1 @ _exti2_3 +1 @ 6
.word aaa +1 @_exti4_15 +1 @ 7
.word aaa +1 @ 8
.word aaa +1 @_dma1_1+1 @ 9
.word aaa +1 @_dma1_2_3 +1 @ 10
.word aaa +1 @_dma1_4_5 +1 @ 11
.word aaa +1 @_adc1 +1 @ 12
.word aaa +1 @_tim1_brk_up +1@ 13
.word aaa +1 @ _tim1_cc +1 @ 14
.word aaa +1 @_tim2 +1 @ 15
.word aaa +1 @_tim3 +1 @ 16
.word aaa +1 @ 17
.word aaa +1 @ 18
.word aaa +1 @_tim14 +1 @ 19
.word aaa +1 @ 20
.word aaa +1 @_tim16 +1 @ 21
.word aaa +1 @_tim17 +1 @ 22
.word aaa +1 @_i2c +1 @ 23
.word aaa +1 @ 24
.word aaa +1 @_spi +1 @ 25
.word aaa +1 @ 26
.word aaa +1 @_usart1 +1 @ 27
.align 2
_start:
shizhong:
ldr r2, = 0x40022000 @FLASH访问控制
movs r1, # 0x32
str r1, @FLASH缓冲 缓冲开启
ldr r0, = 0x40021000 @ rcc
ldr r1, = 0x10001
str r1,
denghse:
ldr r1,
lsls r1, r1, # 14
bpl denghse
dengpllguan:
ldr r1,
lsls r1, r1, # 6
bmi dengpllguan
ldr r1, = 0x110002
str r1,
ldr r1, = 0x1010001
str r1,
dengpll:
ldr r1,
lsls r1, # 6
bpl dengpll
@0x34时钟控制寄存器 2 (RCC_CR2)
movs r1, # 0x01
str r1, @ HSI开14M时钟
dengdai14mshizhongwending:
ldr r1,
lsls r1, r1, # 30 @ 左移30位
bpl dengdai14mshizhongwending@ 等待14M时钟稳定
_neicunqingling:
ldr r0, = 0x20000000
movs r1, # 0
ldr r3, = 0x1000
_neicunqinglingxunhuan:
subs r3, # 4
str r1,
bne _neicunqinglingxunhuan
_waisheshizhong: @ 外设时钟
@+0x14=RCC_AHBENR
@0=DMA @2=SRAM @4=FLITF@6=CRC @17=PA @18=PB @19=PC @20=PD @22=PF
ldr r0, = 0x40021000
ldr r1, = 0x460005
str r1,
@+0x18外设时钟使能寄存器 (RCC_APB2ENR)
@0=SYSCFG @5=USART6EN @9=ADC @11=TIM1 @12=SPI1 @14=USART1 @16=TIM15 @17=TIM16 @18=TIM17 @22=DBGMCU
ldr r1, = 0xa00
str r1,
@+0X1C=RCC_APB1ENR
@1=TIM3 @4=TIM6 @5=TIM7 @8=TIM14 @11=WWDG @14=SPI @17=USRT2 @18=USART3 @20=USART5 @21=I2C1
@22=I2C2 @23=USB @28=PWR
tim1chushiha:
ldr r0, = 0x40012c00 @ tim1_cr1
movs r1, # 0
str r1, @ psc
ldr r1, = 96
str r1, @ ARR
ldr r1, = 0x68
str r1, @ ccmr2CC3
ldr r1, = 0x100 @CC3
str r1, @ ccer
ldr r1, = 0x8000
str r1, @ BDTR
ldr r1, = 0x800 @ CC3 DMA
str r1, @ DIER
ldr r1, = 0xe1
str r1,
_adcchushihua:
ldr r0, = 0x40012400@ adc基地址
ldr r1, = 0x80000000
str r1, @ ADC 控制寄存器 (ADC_CR)@adc校准
_dengadcjiaozhun:
ldr r1,
movs r1, r1
bmi _dengadcjiaozhun @ 等ADC校准
_kaiadc:
ldr r1,
movs r2, # 0x01
orrs r1, r1, r2
str r1,
_dengdaiadcwending:
ldr r1,
lsls r1, r1, # 31
bpl _dengdaiadcwending @ 等ADC稳定
_tongdaoxuanze:
ldr r1, = 0x01
str r1, @ 通道选择寄存器 (ADC_CHSELR)
ldr r1, = 0x3000 @ 13 连续转换
str r1, @ 配置寄存器 1 (ADC_CFGR1)
movs r1, # 0 @
str r1, @ ADC 采样时间寄存器 (ADC_SMPR)
ldr r1,
movs r2, # 0x04 @ 开始转换
orrs r1, r1, r2
str r1, @ 控制寄存器 (ADC_CR)
dmachushihua:
@+0=LSR,+4=IFCR,
@+8=CCR1,+c=CNDTR1,+10=CPAR1+14=CMAR1,
@+1c=CCR2,+20=CNDTR2,+24=CPAR2,+28=CMAR2
@+30=CCR3,+34=CNDTR3,+38=CPAR2,+3c=CMAR3
@+44=CCR4,+48=CNDTR4,+4c=CPAR4,+50=CMAR4
@+58=CCR5,+5c=CNDTR5,+60=CPAR5,+64=CMAR5
@+6C=CCR6,+70=CNDTR6,+74=CPAR6,+78=CMAR6
@+80=CCR7,+84=CNDTR7,+88=CPAR7,+8c=CMAR7
@tim1ch3DMA
ldr r0, = 0x40020000
ldr r1, = 0x40012c3c @ 外设地址
str r1,
ldr r1, = zheng_xian_biao @ 储存器地址
str r1,
ldr r1, = 100 @点数
str r1,
ldr r1, = 0x25b1 @ 储存到外设
str r1,
_waishezhongduan: @外设中断
@0xE000E100 0-31写1开,写0没效
@0XE000E180 0-31 写1关,写0没效
@0XE000E200 0-31 挂起,写0没效
@0XE000E280 0-31 清除, 写0没效
_systick: @ systick定时器初始化
ldr r0, = 0xe000e010
ldr r1, = 0xffffff
str r1,
str r1,
movs r1, # 0x07
str r1,
io_she_zhi:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@a(0x48000000)b(0x48000400)c(0x48000800)d(0x48000c00)f(0x48001400)
@ 输入(00),通用输出(01),复用功能(10),模拟(11)
@偏移0x4 = 端口输出类型 @ (0 推挽),( 1 开漏)
@偏移0x8 = 输出速度00低速, 01中速, 11高速
@偏移0xC = 上拉下拉 (00无上下拉,01 上拉, 10下拉)
@偏移0x10 = 输入数据寄存器
@偏移0x14 = 输出数据寄存器
@偏移0x18 = 端口开0-15置位
@偏移0x28 = 端口关
@0X20 = 复用低
@GPIO口0(0-3位)每个IO口占用4位
@ AF0 = 0X0000, AF1 = 0X0001, AF2 = 0X0010 AF3 = 0X0011, AF4 = 0X0100
@ AF5 = 0X0101, AF6 = 0X0111, AF7 = 0X1000
@0x24 = 复用高
@GPIO口8 (0-3位)每个IO口占用4位
@ AF0 = 0X0000, AF1 = 0X0001, AF2 = 0X0010 AF3 = 0X0011, AF4 = 0X0100
@ AF5 = 0X0101, AF6 = 0X0111, AF7 = 0X1000
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
ldr r0, = 0x48000000
ldr r1, = 0x28205553
str r1,
movs r1, # 0xfc@ pa2-pa7开漏输出
str r1,
ldr r1, = 0x200
str r1,
_lcdchushihua:
movs r0, # 0x33
movs r1, # 0
bl _xielcd
bl _lcdyanshi
movs r0, # 0x32
movs r1, # 0
bl _xielcd
bl _lcdyanshi
movs r0, # 0x28
movs r1, # 0
bl _xielcd
bl _lcdyanshi
movs r0, # 0x0c
movs r1, # 0
bl _xielcd
bl _lcdyanshi
movs r0, # 0x01
movs r1, # 0
bl _xielcd
bl _lcdyanshi
_tingting:
ldr r0, = jishu
ldr r1,
cmp r1, # 8
beq _lcddi1
cmp r1, # 16
beq _lcddi2
cmp r1, # 24
beq _lcddi3
b _tiaoguoguanggao
_lcddi1:
movs r0, # 0x80
ldr r1, = lcdshuju
movs r2, # 16
bl _lcdxianshi
ldr r0, = 0x40020000
ldr r1, = 0
str r1,
b _tiaoguoguanggao
_lcddi2:
movs r0, # 0x80
ldr r1, = dianhua
movs r2, # 16
bl _lcdxianshi
b _tiaoguoguanggao
_lcddi3:
movs r0, # 0x80
ldr r1, = qq
movs r2, # 16
bl _lcdxianshi
ldr r0, = jishu
movs r1, # 0
str r1,
_tiaoguoguanggao:
movs r0, # 0xc0
ldr r1, = xiaomai
movs r2, # 9
bl _lcdxianshi
bl _chuanganqi
movs r1, # 4
ldr r2, = asciimabiao
movs r3, # 0xff
bl _zhuanascii
movs r0, # 0xcc
ldr r1, = asciimabiao
movs r2, # 0x04
bl _lcdxianshi
b _tingting
_chuanganqi: @出
@R0=幅值,R1=相位
push {r2-r7,lr}
ldr r0, = 0x40012400
movs r1, # 0x01
str r1,
bl _jianbo @检波90、270
bl _jisuanfuzhi @计算90幅度
mov r2, r0
mov r0, r1
bl _jisuanfuzhi @计算270幅度
mov r1, r0
mov r0, r2
bl _xiangweipanduan @判断相位
mov r4, r1
mov r3, r0
ldr r0, = lvbohuanchong @滤波器缓冲区
movs r1, # 16 @级数
ldr r2, = lvbozhizhen @滤波器指针
bl _lvboqi @平滑,平均滤波器
mov r1, r4
pop {r2-r7,pc}
_xiangweipanduan: @相位判断
@入R0=90度,R1=270度
@出R0=相之间相差的数值,
@出R1=1,90度是正,R1=0,90度是负
push {r2,lr}
subs r1, r1, # 0 @ 校准0点
subs r2, r0, r1
bpl _adc90shizheng
subs r2, r1, r0
bpl _adc90shifu
cmp r0, r1
bne _xiangweipanduanfanhui
_adc90shizheng:
mov r0, r2
movs r1, # 1
pop {r2,pc}
_adc90shifu:
mov r0, r2
movs r1, # 0
pop {r2,pc}
_xiangweipanduanfanhui:
movs r0, # 0
movs r1, # 1
pop {r2,pc}
_jisuanfuzhi: @计算幅值
@入R0出R0
@R0=ADC90度采样
push {r1-r3,lr}
cmp r0, # 0
beq _adcshi0fanhui
ldr r1, = 0x04 @实 Q15
ldr r2, = 0xffff8004 @虚 Q15
mov r3, r0
muls r0, r0, r1 @实
asrs r0, r0, # 15
muls r3, r3, r2 @虚
asrs r3, r3, # 15
_shibushibushi0: @检测实部是不是负数
movs r0, r0
bpl _fzbushifushu1
mvns r0, r0 @是负数转成正数
adds r0, r0, # 1
_fzbushifushu1: @检测虚部是不是负数
movsr3, r3
bpl _fzbushifushu
mvns r3, r3 @是负数转成正数
adds r3, r3, # 1
_fzbushifushu:
adds r0, r0, r3 @相加得到副值
_adcshi0fanhui:
pop {r1-r3,pc}
_jianbo: @检波
@输出r0=90度,R1=270度
push {r2-r4,lr}
ldr r2, = 0x4002005c
ldr r3, = 0x40012440
cpsid i
_jianbo90du:
ldr r4,
cmp r4, # 25
bne _jianbo90du
ldr r0, @取出90度
_jianbo270du:
ldr r4,
cmp r4, # 75
bne _jianbo270du
ldr r1,
cpsie i
pop {r2-r4,pc}
_lvboqi: @滤波器
@R0=地址,R1=长度,r2=表指针地址,r3=ADC数值
@出R0=结果
push {r1-r7,lr}
ldr r5, @读出表指针
lsls r6, r1, # 2
str r3, @数值写到滤波器缓冲区
adds r5, r5, # 4
cmp r5, r6
bne _lvboqimeidaohuanchongquding
movs r5, # 0
_lvboqimeidaohuanchongquding:
str r5,
movs r7, # 0
_lvboqixunhuan:
cmp r5, r6
bne _lvbozonghe
movs r5, # 0
_lvbozonghe:
ldr r4,
adds r5, r5, # 4
adds r7, r7, r4
subs r1, r1, # 1
bne _lvboqixunhuan
asrs r0, r7, # 4 @修改
pop {r1-r7,pc}
_lcdxianshi: @r0=LCD位置,r1=数据地址,r2=长度
push {r0-r4,lr}
mov r4, r1
movs r1, # 0
bl _xielcd
movs r1, # 1
movs r3, # 0
_lcdxianshixunhuan:
ldrb r0,
bl _xielcd
adds r3, r3, # 1
cmp r3, r2
bne _lcdxianshixunhuan
pop {r0-r4,pc}
_lcdyanshi:
push {r5,lr}
ldr r5, = 0x2000
_lcdyanshixunhuan:
subs r5, r5, # 1
bne _lcdyanshixunhuan
pop {r5,pc}
_xielcd: @入R0=8位,r1=0命令,r1=1数据
push {r0-r7,lr}
lsrs r6, r0, # 4
lsls r0, r0, # 28
lsrs r0, r0, # 28
movs r2, # 0x80 @ RS
movs r3, # 0x40 @ E
movs r5, # 0x3c
ldr r4, = 0x48000000
cmp r1, # 0
beq _lcdmingling
str r2, @RS=1
b _lcdshuju
_lcdmingling:
str r2, @RS=0
_lcdshuju:
str r3, @E=1
str r5,
lsls r7, r6, # 31
lsrs r7, r7, # 26
str r7,
lsrs r7, r6, # 1
lsls r7, r7, # 31
lsrs r7, r7, # 27
str r7,
lsrs r7, r6, # 2
lsls r7, r7, # 31
lsrs r7, r7, # 28
str r7,
lsrs r7, r6, # 3
lsls r7, r7, # 31
lsrs r7, r7, # 29
str r7,
bl _lcdyanshi
str r3, @E=0
str r3, @E=1
str r5,
lsls r7, r0, # 31
lsrs r7, r7, # 26
str r7,
lsrs r7, r0, # 1
lsls r7, r7, # 31
lsrs r7, r7, # 27
str r7,
lsrs r7, r0, # 2
lsls r7, r7, # 31
lsrs r7, r7, # 28
str r7,
lsrs r7, r0, # 3
lsls r7, r7, # 31
lsrs r7, r7, # 29
str r7,
bl _lcdyanshi
str r3, @E=0
pop {r0-r7,pc}
.ltorg
_zhuanascii: @ 16进制转ASCII
@ R0要转的数据, R1长度,R2结果表首地址, r3=小数点位置
push {r0-r7,lr}
mov r7, r3
mov r5, r0
mov r6, r1
movs r1, # 10
_xunhuanqiuma:
bl _chufa
mov r4, r0
muls r4, r1
subs r3, r5, r4
adds r3, r3, # 0x30
mov r5, r0
subs r6, r6, # 1
beq _qiumafanhui
cmp r6, r7
bne _meidaoxiaoshudian
movs r4, # 0x2e @小数点
strb r4, @插入小数点
subs r6, r6, # 1
_meidaoxiaoshudian:
strb r3,
movs r6, r6
bne _xunhuanqiuma
pop {r0-r7,pc}
_qiumafanhui:
strb r3,
pop {r0-r7,pc}
_chufa: @软件除法
@ r0 除以 r1 等于 商(r0)余数R1
push {r1-r4,lr}
cmp r0, # 0
beq _chufafanhui
cmp r1, # 0
beq _chufafanhui
mov r2, r0
movs r3, # 1
lsls r3, r3, # 31
movs r0, # 0
mov r4, r0
_chufaxunhuan:
lsls r2, r2, # 1
adcs r4, r4, r4
cmp r4, r1
bcc _chufaweishubudao0
adds r0, r0, r3
subs r4, r4, r1
_chufaweishubudao0:
lsrs r3, r3, # 1
bne _chufaxunhuan
_chufafanhui:
pop {r1-r4,pc}
.ltorg
_nmi_handler:
bx lr
_hard_fault:
bx lr
_svc_handler:
bx lr
_pendsv_handler:
bx lr
_systickzhongduan:
ldr r2, = jishu
ldr r0, = 0xe000ed04
ldr r3,
ldr r1, = 0x02000000
adds r3, r3, # 1
str r3,
str r1, @ 清除SYSTICK中断
aaa:
bx lr
这是弄技术的农民,软硬都懂,:victory::victory: 进来一看,一个核桃都没有。:lol
这个虽然不是很准确,作为参考还是可以的。
DIY就是外壳不好做,这类小仪器建议用台式电脑的坏电源外壳改装,可以做的比较好看。 用汇编,真有耐心。
弱弱问下,写代码和割麦子那个更辛苦?;P 直接上arm汇编,现在有这种本事和耐心的少了 测量原理上有硬伤,精度高不了,麦粒大小、样品紧实度、小麦品质的影响,每一种测量方法都有局限性 查了下,小麦的水分检测都是采用干燥失重原理来做的。 林间小溪 发表于 2019-5-28 09:31
这是弄技术的农民,软硬都懂,
我硬件一点也不懂,软件不会数学和物理也不行。 qie 发表于 2019-5-28 12:42
进来一看,一个核桃都没有。
这个虽然不是很准确,作为参考还是可以的。
DIY就是外壳不好做,这类小 ...
以前厚的白铁皮做粮仓了,只有一些薄的做不了机壳,这次买了一些厚一点的白铁皮可以做机壳,慢慢练练希望能做的漂亮一些。 :lol 懂技术的农民,佩服!
虽然不懂麦子,不过觉得 7 楼所说有道理,感觉按这个思路可以提高精度 夏国特 发表于 2019-5-28 15:37
用汇编,真有耐心。
弱弱问下,写代码和割麦子那个更辛苦?
在您的推荐下学了一段时间IMX6ULL和LINUX,后来做东西被打断了,现在不知道是学LINUX还是学单片机,学LINUX我们这小县城根本没这方面的工作,只有一些做硬度计之类金属检测仪器的。
现在收割小麦就是摊晒和卖需要人工,一年忙不几天,就看天好不好,也没粮食烘干机。
感觉程序这东西自己写任何语言都难,用别人写的就容易。 ace919 发表于 2019-5-28 17:36
直接上arm汇编,现在有这种本事和耐心的少了
汇编不难就那么几条指令,关键还是数学和物理,这两样我根本不懂,理论不行做什么也做不好。 大孔景元 发表于 2019-5-28 17:59
测量原理上有硬伤,精度高不了,麦粒大小、样品紧实度、小麦品质的影响,每一种测量方法都有局限性
这种就是快速检测的准确度差一些,我这能力根本做不准,我看外国的是149M的,国内的好像是50M的。
1134761078 发表于 2019-5-28 18:38
这样很好呀,电路进一步的完善之后就可以开发产品了,农户需要这样的测试仪器
产品是不可能了,我没有那技术,国家对检测粮食水分的仪器管理比较严格,好像要通过检测,所以只能做着玩,我本来想做检测土壤湿度给菜地浇水的,不过农民用不到这些技术,农民就靠牙咬手摸,农业产值低用不起先进技术。
页:
[1]
2