#---------------------------------------- # karacrix_KBRS31.py # v1.00 2016/10/20: Release #---------------------------------------- import time import RPi.GPIO as GPIO #---------------------------------------- KcxRASPORT_Di_1 = 9 KcxRASPORT_Di_2 = 25 KcxRASPORT_Di_3 = 10 KcxRASPORT_Di_4 = 24 KcxRASPORT_Do_1 = 23 KcxRASPORT_Do_2 = 27 KcxRASPORT_Do_3 = 17 KcxRASPORT_Do_4 = 18 KcxRASPORT_Do_5 = 7 KcxRASPORT_Do_6 = 22 KcxRASPORT_AD_din = 3 KcxRASPORT_AD_cs = 2 KcxRASPORT_AD_sclk = 14 KcxRASPORT_AD_dout = 15 KcxRASPORT_AD_sstrb = 4 KcxRASPORT_AiCMP = 11 KcxRASPORT_WdtPulse = 8 #---------------------------------------- GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(KcxRASPORT_Di_1,GPIO.IN) GPIO.setup(KcxRASPORT_Di_2,GPIO.IN) GPIO.setup(KcxRASPORT_Di_3,GPIO.IN) GPIO.setup(KcxRASPORT_Di_4,GPIO.IN) GPIO.setup(KcxRASPORT_Do_1,GPIO.OUT) GPIO.setup(KcxRASPORT_Do_2,GPIO.OUT) GPIO.setup(KcxRASPORT_Do_3,GPIO.OUT) GPIO.setup(KcxRASPORT_Do_4,GPIO.OUT) GPIO.setup(KcxRASPORT_Do_5,GPIO.OUT) GPIO.setup(KcxRASPORT_Do_6,GPIO.OUT) GPIO.output(KcxRASPORT_Do_1,False) GPIO.output(KcxRASPORT_Do_2,False) GPIO.output(KcxRASPORT_Do_3,False) GPIO.output(KcxRASPORT_Do_4,False) GPIO.output(KcxRASPORT_Do_5,False) GPIO.output(KcxRASPORT_Do_6,False) GPIO.setup(KcxRASPORT_AD_din,GPIO.OUT) GPIO.setup(KcxRASPORT_AD_cs,GPIO.OUT) GPIO.setup(KcxRASPORT_AD_sclk,GPIO.OUT) GPIO.setup(KcxRASPORT_AD_dout,GPIO.IN) GPIO.setup(KcxRASPORT_AD_sstrb,GPIO.IN) GPIO.setup(KcxRASPORT_AiCMP,GPIO.IN) GPIO.setup(KcxRASPORT_WdtPulse,GPIO.OUT) GPIO.output(KcxRASPORT_AD_din,False) GPIO.output(KcxRASPORT_AD_cs,False) GPIO.output(KcxRASPORT_AD_sclk,False) GPIO.output(KcxRASPORT_WdtPulse,False) #--------------------------------------------------- def cleanup(): GPIO.cleanup() #--------------------------------------------------- def dout(ch,data): if ch == 1: if data == 0: GPIO.output(KcxRASPORT_Do_1,False) else: GPIO.output(KcxRASPORT_Do_1,True) elif ch == 2: if data == 0: GPIO.output(KcxRASPORT_Do_2,False) else: GPIO.output(KcxRASPORT_Do_2,True) elif ch == 3: if data == 0: GPIO.output(KcxRASPORT_Do_3,False) else: GPIO.output(KcxRASPORT_Do_3,True) elif ch == 4: if data == 0: GPIO.output(KcxRASPORT_Do_4,False) else: GPIO.output(KcxRASPORT_Do_4,True) elif ch == 5: if data == 0: GPIO.output(KcxRASPORT_Do_5,False) else: GPIO.output(KcxRASPORT_Do_5,True) elif ch == 6: if data == 0: GPIO.output(KcxRASPORT_Do_6,False) else: GPIO.output(KcxRASPORT_Do_6,True) elif ch == 7: if data == 0: GPIO.output(KcxRASPORT_WdtPulse,False) else: GPIO.output(KcxRASPORT_WdtPulse,True) #--------------------------------------------------- def din(ch): if ch == 1: port = GPIO.input(KcxRASPORT_Di_1) elif ch == 2: port = GPIO.input(KcxRASPORT_Di_2) elif ch == 3: port = GPIO.input(KcxRASPORT_Di_3) elif ch == 4: port = GPIO.input(KcxRASPORT_Di_4) else: port = 1 if port == 1: data = 0 else: data = 1 return data #--------------------------------------------------- def ad_reset(): GPIO.output(KcxRASPORT_AD_cs,True) GPIO.output(KcxRASPORT_AD_sclk,False) #1)ChipReset time.sleep(0.01) cmd = 0x00C8; #ManualTable8 GPIO.output(KcxRASPORT_AD_cs,False) for i in range(0,8): GPIO.output(KcxRASPORT_AD_din,(cmd & (0x80>>i))) GPIO.output(KcxRASPORT_AD_sclk,True) GPIO.output(KcxRASPORT_AD_sclk,False) GPIO.output(KcxRASPORT_AD_cs,True) GPIO.output(KcxRASPORT_AD_sclk,False) #2)InternalClock(Mode2) time.sleep(0.01) cmd = 0x00A8; #ManualTable8 GPIO.output(KcxRASPORT_AD_cs,False) for i in range(0,8): GPIO.output(KcxRASPORT_AD_din,(cmd & (0x80>>i))) GPIO.output(KcxRASPORT_AD_sclk,True) GPIO.output(KcxRASPORT_AD_sclk,False) GPIO.output(KcxRASPORT_AD_cs,True) GPIO.output(KcxRASPORT_AD_sclk,False) #--------------------------------------------------- range_mode_1ch = 0 range_mode_2ch = 0 range_mode_3ch = 0 range_mode_4ch = 0 def ad_rangeset(ch,urange): global range_mode_1ch global range_mode_2ch global range_mode_3ch global range_mode_4ch range_R210 = 0x03 if urange == 4: range_R210 = 0x07; # +-12v (over) if urange == 3: range_R210 = 0x04; # +- 6v if urange == 2: range_R210 = 0x01; # +- 3v if urange == 1: range_R210 = 0x06; # + 12v (over) if urange == 0: range_R210 = 0x03; # + 6v _maximch = 3 if ch == 1: _maximch = 0; range_mode_1ch = urange if ch == 2: _maximch = 1; range_mode_2ch = urange if ch == 3: _maximch = 2; range_mode_3ch = urange if ch == 4: _maximch = 3; range_mode_4ch = urange cmd = ( _maximch << 4 ) | range_R210 | 0x80 GPIO.output(KcxRASPORT_AD_cs,False) for i in range(0,8): GPIO.output(KcxRASPORT_AD_din,(cmd & (0x80>>i))) GPIO.output(KcxRASPORT_AD_sclk,True) GPIO.output(KcxRASPORT_AD_sclk,False) GPIO.output(KcxRASPORT_AD_cs,True) GPIO.output(KcxRASPORT_AD_sclk,False) #--------------------------------------------------- def ad_getval(ch): GPIO.output(KcxRASPORT_AD_cs,True) GPIO.output(KcxRASPORT_AD_sclk,False) GPIO.output(KcxRASPORT_AD_din,False) GPIO.output(KcxRASPORT_AD_cs,False) #Active CS _maximch = 3 if ch == 1: _maximch = 0 if ch == 2: _maximch = 1 if ch == 3: _maximch = 2 if ch == 4: _maximch = 3 cmd = ( _maximch << 4 ) | 0x80 for i in range(0,8): GPIO.output(KcxRASPORT_AD_din,(cmd & (0x80>>i))) GPIO.output(KcxRASPORT_AD_sclk,True) GPIO.output(KcxRASPORT_AD_sclk,False) GPIO.output(KcxRASPORT_AD_cs,True) for i in range(0,20): if GPIO.input(KcxRASPORT_AD_sstrb) > 0: break time.sleep(0.0001) GPIO.output(KcxRASPORT_AD_cs,False) getval = 0 for i in range(0,16): GPIO.output(KcxRASPORT_AD_sclk,True) if GPIO.input(KcxRASPORT_AD_dout) > 0: add_data = 1 else: add_data = 0 getval = (getval<<1) | add_data GPIO.output(KcxRASPORT_AD_sclk,False) GPIO.output(KcxRASPORT_AD_cs,True) GPIO.output(KcxRASPORT_AD_din,False) return getval #--------------------------------------------------- def ad_getvolt(ch): global range_mode_1ch global range_mode_2ch global range_mode_3ch global range_mode_4ch range_mode = 0 if ch == 1: range_mode = range_mode_1ch if ch == 2: range_mode = range_mode_2ch if ch == 3: range_mode = range_mode_3ch if ch == 4: range_mode = range_mode_4ch adcval = ad_getval(ch) if range_mode == 4: # +- 12.288v (over) volt = 0.0 if range_mode == 3: # +- 6.144v volt = ( 2.0 * 6.144 ) * ( adcval / 65535.0 ) - 6.144 if range_mode == 2: # +- 3.072v volt = ( 2.0 * 3.072 ) * ( adcval / 65535.0 ) - 3.072 if range_mode == 1: # 0 - 12.288v (over) volt = 0.0 if range_mode == 0: # 0 - 6.144v volt = 6.144 * ( adcval / 65535.0 ) return volt def ain(ch): return ad_getvolt(ch) #--------------------------------------------------- def ad_init(range1,range2,range3,range4): ad_reset() ad_rangeset(1,range1) ad_rangeset(2,range2) ad_rangeset(3,range3) ad_rangeset(4,range4) #--------------------------------------------------- ad_init(0,0,0,0) #input_range:0-6v #--------------------------------------------------- #END