redelz 发表于 2024-3-9 11:40:42

STC单片机ADC接口实现8通道霍尔元件直流电流测量

1,采用十位二进制分辨率实现了8通道综合显示精度0.5%。
   霍尔元件直流电流测量,实际应用于太阳能控制系统和LED灯具老化测试。
   采用霍尔元件实现完全与被测电路绝缘。
2,由于霍尔元件输出信号弱需要较大的放大倍数,所以测量部分采用了16级滤波算法。
3,尽管采用了高精度电阻但是由于放大倍数高,造成每个通道的实际测量值不一致,
   必须采用每个通道单独进行线性标定。就是确认初始偏移量和显示值与实际安培数相符。
   为了大批量生产还必须实现自动参数标定,标定后参数记忆。
4,实际电流值可以在PLC的主机上的四位数码管上显示,并且与梯形图程序联动。
   下面是模拟量采样相关代码
;/*----------------------------
;Initial ADC sfr
;----------------------------*/
;
;/*Declare SFR associated with the ADC */;
;/*Define ADC operation const for ADC_CONTR*/
ADC_POWER   EQU 80H             ;ADC power control bit
ADC_FLAG    EQU 10H             ;ADC complete flag
ADC_START   EQU 08H             ;ADC start control bit
ADC_SPEEDLL EQU 00H             ;420 clocks
ADC_SPEEDLEQU 20H             ;280 clocks
ADC_SPEEDHEQU 40H             ;140 clocks
ADC_SPEEDHH EQU 60H             ;70 clocks
;
ADC_ADRJ    EQU      20H                ;ADRJ in AUXR1 0 As ADC_RES has 8 bits, 1 As ADC_RESL has low 8 bits
ADC_EADC    EQU 20H                ;enable ADC interrupt
;
;ADCCH       DATA 20H            ;ADC channel NO.
;/*----------------------------
;Initial ADC sfr
;----------------------------*/
INIT_ADC:
      clr      ADCSet
      MOV         P1ASF,#0FFH                   ;Open 8 channels ADC function
      orl      PCON2,#ADC_ADRJ                ;set ADC_ADJ to 1
;      anl      AUXR1,#(NOT (ADC_ADRJ))      ;set ADC_ADJ to 0
      MOV         ADC_RES,#0                  ;Clear previous result
      mov      ADC_RESL,#0
      mov      a,ADCChCnt                ;get channel number
      ORL         A,#(ADC_POWER OR ADC_SPEEDLL OR ADC_START)
      MOV         ADC_CONTR,a                ;set control register for ADC
      MOV         A,#2                        ;ADC power-on and delay
      LCALL         Delays
      setb      EADC                        ;enable interrupt
      setb      ea
      RET
;/*----------------------------
;ADC interrupt service routine
;----------------------------*/
;/*----------------------------
;ADC interrupt service routine
;----------------------------*/
BUMP_MASK      equ      0Fh                ;mask out bump index
BUMP_TRIAL      equ      16                ;trial size pointor
ADC_ISR:
      clr      ea
      PUSH          PSW
      PUSH          ACC
      mov      AdcIndex,ADCChCnt
      ANL         ADC_CONTR,#(NOT(ADC_FLAG));Clear ADC interrupt flag
      mov      a,ADC_RESL                ;ADC_RES                ;ADC_RESL                ;get low byte
      mov      CurTl,a
      MOV         A,ADC_RES                     ;Get ADC high 8-bit result
      anl      a,#03h                        ;10 bits Result
      mov      CurTh,a
      INC         ADCChCnt
      ANL         ADCChCnt,#07H
      mov      a,ADCChCnt
      ORL         A,#(ADC_POWER OR ADC_SPEEDLL OR ADC_START)
      MOV         ADC_CONTR,A                   ;ADC power-on delay and re-start A/D conversion
      setb      ADCSet
      POP         ACC
      POP         PSW
      setb      ea
      RETI








xiangzichen 发表于 2024-3-9 15:04:29

看到汇编不由得心中一惊.wc,大神.

科学妞妞 发表于 2024-3-10 22:30:06

咫尺天涯 发表于 2024-3-12 14:51:53

模块扩展用的SPI?
页: [1]
查看完整版本: STC单片机ADC接口实现8通道霍尔元件直流电流测量