Jump to content

AjayLeafi

Members
  • Posts

    2
  • Joined

  • Last visited

Posts posted by AjayLeafi

  1. Hi everyone,

    Objective of the code: After confirming that the data is ready, the code reads the data from the specified channels. The goal is to identify changes in the signal, particularly detecting when there is a transition or edge change in the input.

    Setup: The code configures a system to read digital inputs from two channels, DIO5 and DIO6.

    Trigger Setup: It sets up a trigger mechanism, likely to start the data acquisition process when a specific condition (trigger) is met on the digital input.

    Data Ready Check: It checks if the data is ready to be read. This is crucial to ensure that the system is prepared to provide meaningful information.

     

    def counter(device_data, channel1,channel2, timout,counts,rpm):
        """
        Count the edge transitions on 2 channels
    
        parameters: - device data
                    - selected DIO channel number
                    - selected DIO channel number
                    - duration of counter
                    - return value of counts
                    - calculated rpm value
        """
    
        sts = ctypes.c_byte()
    
    
        hzDI = ctypes.c_double()
    
        cSamples = 4096
        rgwSamples = (ctypes.c_uint16*cSamples)()
      
        current_time = datetime.now()
    
        # Print the current time
        print("Current System Time:", current_time)
        print("Waiting for acquisition...")
        while True:
            dwf.FDwfDigitalInStatus(device_data.handle, ctypes.c_int(1), ctypes.byref(sts))
            print(sts.value)
            if sts.value != None :
                break
            time.sleep(1)
        print("   done")
    
        # Get the current system time
        current_time = datetime.now()
    
        # Print the current time
        print("Current System Time:", current_time)                                                                 
    
        # get samples, byte size
        dwf.FDwfDigitalInStatusData(device_data.handle, rgwSamples, 2*cSamples)
        dwf.FDwfDeviceCloseAll()
        print(rgwSamples)
    
        # Extract dio1 (f1) and dio2 (f2) values
        dioa = [(sample >> channel1-1) for sample in rgwSamples]
        diob = [(sample >> channel2-1) for sample in rgwSamples]
    
        count = 0
        edge_indices_dio1, edge_samples_dio1 = find_edges_with_indices(dioa)
        edge_indices_dio2, edge_samples_dio2 = find_edges_with_indices(diob)
        for idx, sample in zip(edge_indices_dio1, edge_samples_dio1):
            print(f"DIO1 Edge at Sample {idx}, Value: {sample}")
            count = count +1
        for idx, sample in zip(edge_indices_dio2, edge_samples_dio2):
            print(f"DIO2 Edge at Sample {idx}, Value: {sample}")
    
        speeds_dio1 = calculate_speed(edge_indices_dio1, edge_samples_dio1, hzDI.value/100e6)
        speeds_dio2 = calculate_speed(edge_indices_dio2, edge_samples_dio2, hzDI.value/100e6)
    
        for i, speed in enumerate(speeds_dio1, start=1):
            print(f"DIO1 Speed between Edges {i} and {i+1}: {speed:.2f} units per second")
    
        for i, speed in enumerate(speeds_dio2, start=1):
            print(f"DIO2 Speed between Edges {i} and {i+1}: {speed:.2f} units per second")
    
        # time.sleep(100)
    
    def find_edges_with_indices(dio):
        edge_indices = []  # List to store the indices of detected edges
        edge_samples = []  # List to store the sample values at edge transitions
        
        prev_sample = dio[0]  # Initialize with the first sample
        
        for i, sample in enumerate(dio[1:], start=1):
            if sample != prev_sample:
                edge_indices.append(i)
                edge_samples.append(sample)
            prev_sample = sample
        
        return edge_indices, edge_samples
    
    def input_trigger_set(device_data,channel1,channel2):
        print("input_trigger set")
        set_mode(device_data=device_data,channel=channel1,output=True)
        # pull_direction = pull()
        # set_pull(device_data=device_data,channel=channel1, direction=pull_direction.idle)
        set_mode(device_data=device_data,channel=channel2,output=True)
        # set_pull(device_data=device_data,channel=channel2, direction=pull_direction.idle)
    
        sts = ctypes.c_byte()
        hzDI = ctypes.c_double()
        dwf.FDwfDigitalInInternalClockInfo(device_data.handle, ctypes.byref(hzDI))
        dwf.FDwfDigitalInDividerSet(device_data.handle, ctypes.c_int(int(hzDI.value/100e6))) # 100MHz
    
        # sample rate = system frequency / divider
        hzDI = ctypes.c_double()
        dwf.FDwfDigitalInInternalClockInfo(device_data.handle, ctypes.byref(hzDI))
        dwf.FDwfDigitalInDividerSet(device_data.handle, ctypes.c_int(int(hzDI.value/100e6))) # 100MHz
        # 16bit per sample format
        dwf.FDwfDigitalInSampleFormatSet(device_data.handle, ctypes.c_int(16))
        # set number of sample to acquire
        cSamples = 4096
        rgwSamples = (ctypes.c_uint16*cSamples)()
        dwf.FDwfDigitalInBufferSizeSet(device_data.handle, ctypes.c_int(cSamples))
    
        # Set trigger
        dwf.FDwfDigitalInTriggerSourceSet(device_data.handle,ctypes.c_int(3))
        dwf.FDwfDigitalInTriggerPositionSet(device_data.handle, ctypes.c_int(int(cSamples/10-1)))
        dwf.FDwfDigitalInTriggerSet(device_data.handle, ctypes.c_int(0), ctypes.c_int(0), ctypes.c_int(1<<channel1), ctypes.c_int(1<<channel1)) 
    
        # begin acquisition
        dwf.FDwfDigitalInConfigure(device_data.handle, ctypes.c_int(1), ctypes.c_int(1))

    The data i get out 

    dioa: [21, 29, 2926, 29, 21, 29, 2926, 29, 21, 29, 2926, 29, 21, 29, ...]

    diob [10, 12, 1463, 12, 10, 12, 1463, 12, 10, 12, 1463, 12, 10, 12, ...]

     

    what could be the problem?

     

     

  2. Hi,

     

    As the name suggests I am trying to develop a multi channel (DIO) pulse counter using the py WF_SDK. 

    My application should count the quadrature pulses of a magnetic encoder within a given time frame and output the amount of positive and negative edges as well as the time from first edge transition till the last edge transition. Because the signal is quadrature, we need to capture the two signals simultaneously.

     

    I'm not sure how this might be possible, TIA.

     

    Thanks,

     

    Ajay

×
×
  • Create New...