PDA

View Full Version : ADC Question



andybarrett1
- 26th October 2015, 21:00
Hi Thank you for reading

I am attempting to read a 4-20mA signal into a PIC ADC across a 250R Resistor (1-5v) ultimately to trigger a couple of digital outputs (set points) !

All is OK.... But I would like to add some hysteresis around the process signal so as to dampen the digitals around the transition time.

My question is how do I do it ?

Been away from PBP to long !! Thank you reading again

BR
Andy

richard
- 26th October 2015, 22:00
if abs(setpoint -reading) > hysteresis then
do something
else
do somethingelse
endif

andybarrett1
- 27th October 2015, 07:07
Hi Richard

Thank you for fast answer ... But I still not understanding ...


How does the ABS work in the code ... Also I assume hysteresis is a constant !

BR
Andy

richard
- 27th October 2015, 08:46
How does the ABS work in the code

abs works as it normally does , read the pbp manual for a detailed explanation



I assume hysteresis is a constant !

only if you want it to be


I would like to add some hysteresis around the process signal

I'm assuming by your initial question that by hysteresis you mean ; set point plus or minus a small amount .
therefore a trigger event occurs when the reading is outside the (setpoint -+ hysteresis) range

there are many more possibilities

HenrikOlsson
- 27th October 2015, 10:18
Hi,
Here's another aproach

ON CON 1
OFF CON 0
Hysteresis CON 5
Setpoint CON 120

Solenoid VAR PortB.0

InputSignal VAR BYTE

' With the above value we will turn the output ON when the SetPoint reaches 125 and OFF when it reaches 115.

If (Solenoid = OFF) AND (InputSignal >= (Setpoint + Hysteresis)) THEN
Solenoid = ON
ENDIF

IF (Solenoid = ON) AND (InputSignal <= (Setpoint - Hysteresis)) THEN
Solenoid = OFF
ENDIF

/Henrik.

andybarrett1
- 31st October 2015, 20:48
Hi Henrik

Thank you for help re:- my coding... Us HW people suffer with S/W issues... Cant see what is happening if cant prod it with Fluke :mad:

Anyway got it working today... See below :-


'************************************************* ***************
'* Name : TRIP.BAS *
'* PIC : PIC16F688 *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2015 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 29/10/2015 *
'* Version : 1.0 *
'* Notes : 322 Words used *
'* : *
'* *
'* Process Signal AN0 *
'* Alarm Preset AN1 *
'* Trip Preset AN2 *
'* Delay Trip Dly RC2 *
'* Alarm Relay RC3 *
'* Trip Relay RC4 *
'* Reset Trip P/B RC5 *
'************************************************* ***************

DEFINE OSC 8 ' Set RC Clock to 8 Megs
CMCON0 = 7 'Disable both comparators

'Define ADCIN parameters
Define ADC_BITS 10 ' Set number of bits in result
Define ADC_CLOCK 3 ' Set clock source (3=rc)
Define ADC_SAMPLEUS 50 ' Set sampling time in uS
ANSEL = %00000111 ' Enable ADC channels AN2-AN0
ADCON1 = %10000000 ' Set PORTA analog and right justify result

'Analogs
PROC_SIG Var word ' Create PROC_SIG to store result
ALARM_TRIM Var word ' Create ALARM_TRIM to store result
TRIP_TRIM Var word ' Create TRIP_TRIM to store result

'Digitals
ALARM_RLY VAR PORTC.3 ' Alarm Relay
TRIP_RLY VAR PORTC.4 ' Trip Relay
TRIP_RST VAR PORTC.5 ' Trip Reset PB
TRIP_DLY VAR PORTC.2 ' Trip Delay Link

'Constants
RLY_OFF CON 0 ' Relay Off
RLY_ON CON 1 ' Relay On
HYS CON 25 ' 25 = 1/8Volt


START:
LOW TRIP_RLY ' Ensures Trip Rly off
LOW ALARM_RLY ' Ensures Alarm Rly off

Gosub ANALOG_READ
If (ALARM_RLY = RLY_OFF) AND (PROC_SIG >= (ALARM_TRIM + HYS)) THEN ALARM_RLY = RLY_ON
If (ALARM_RLY = RLY_ON) AND (PROC_SIG <= (ALARM_TRIM - HYS)) THEN ALARM_RLY = RLY_OFF
If (TRIP_RLY = RLY_OFF) AND (PROC_SIG >= (TRIP_TRIM + HYS)) and TRIP_DLY = 0 THEN goto D_TRIP
If (TRIP_RLY = RLY_OFF) AND (PROC_SIG >= (TRIP_TRIM + HYS)) AND TRIP_DLY = 1 THEN goto L_TRIP
GOTO START


L_TRIP: ' Latching Trip
high TRIP_RLY ' Latch Trip Relay
IF TRIP_RST = 0 THEN GOTO START 'Release If PB Reset Pressed
Goto L_trip

D_TRIP: ' Delayed Trip
HIGH TRIP_RLY ' Latch Trip Relay
PAUSE 1000 ' Pause for T_Delay
GOTO START

ANALOG_READ: ' Read analogs
ADCIN 0, PROC_SIG ' Read channel 0 to PROC_SIG
ADCIN 1, ALARM_TRIM ' Read channel 1 to ALARM_TRIM
ADCIN 2, TRIP_TRIM ' Read channel 2 to TRIP_TRIM
RETURN

END

Anything you see wrong in my attempt above do tell ..... Is there a correct order to list the defines / setup etc ?

Thank you again for your help

BR
Andy

richard
- 31st October 2015, 23:05
you might need another read of the hardware manual for a 16f688:)


'Define ADCIN parameters
Define ADC_BITS 10 ' Set number of bits in result
Define ADC_CLOCK 3 ' Set clock source (3=rc)
Define ADC_SAMPLEUS 50 ' Set sampling time in uS
ANSEL = %00000111 ' Enable ADC channels AN2-AN0
ADCON1 = %10000000 ' Set PORTA analog and right justify result ?????????????


this will REALLY be
ADCON1 = %10000000 ' Set Conversion Clock = FOSC/2 and bit 7 does nothing

you need

ADCON0.7=1 ' right justify result

andybarrett1
- 1st November 2015, 11:11
Hi Richard

Point taken on ADCON1... My Bad !

But ADCON0 = %10000001

BIT 7 = Right justify
BIT 1 = ADC Enable

BR
Andy