Форум: Техническая поддержка

Тема: E502 ЦАП. Генерация сигнала меандра с помощью Python

Вы не вошли.

 Поиск | Регистрация | Вход 

04.03.2024 15:34:35
#1

Участник
Здесь с 04.10.2023
Сообщений: 3

E502 ЦАП. Генерация сигнала меандра с помощью Python

Здравствуйте! Используемая версия Python - 3.10.11 32 bit.
Реализуемый код:

#!/usr/bin/python3-32
# -*- coding: utf-8 -*-
import ctypes
from ctypes import cdll, pointer, c_ulong, Structure
import time
import math
import array

# ------------------------------ Structure e502 -------------------------------------
class Read_x502(Structure):
    _pack_ = 1
    _fields_ = [('arr', ctypes.c_uint32 * 1),   # 1 список, т.к. одна плата
                ('devs', ctypes.c_uint32)]

class t_x502_cbr_coef(Structure):
    _pack_ = 1
    _fields_ = [('offs', ctypes.c_double),
                ('k', ctypes.c_double)]

class t_x502_cbr(Structure):
    _pack_ = 1
    _fields_ = [('adc', t_x502_cbr_coef*6),
                ('rez1', ctypes.c_uint32*64),
                ('dac', t_x502_cbr_coef*2),
                ('rez2', ctypes.c_uint32*20)]

class t_x502_info(Structure):
    _pack_ = 1
    _fields_ = [('BrdName', ctypes.c_char*32),
                ('SerNum', ctypes.c_char*32),
                ('devflags', ctypes.c_uint32),
                ('fpga_ver', ctypes.c_uint16),
                ('plda_ver', ctypes.c_uint8),
                ('board_rev', ctypes.c_uint8),
                ('mcu_firmware_ver', ctypes.c_uint32),
                ('factory_mac', ctypes.c_uint8*6),
                ('rezerv', ctypes.c_uint8*110),
                ('cbr', t_x502_cbr)]
   
def dac_synchr():
    # Работа с модулем при синхронном потоковом выводе на ЦАП:
    pyarr = (ctypes.c_double * len(volt_dac))(*volt_dac)            # начальный массив с некалиброванными значениями
    volt_dac_ok = (ctypes.c_double * len(volt_dac))()               # возвращаемый массив с калиброванными значениями
    #lib2.X502_AsyncOutDac(Create, 1, int(volt_dac[0]), 0x0002)

    # lib2.X502_SetOutFreq(Create, ctypes.pointer(ctypes.c_double(size)))
    # lib2.X502_StreamsEnable(Create, dac_numb)
    # lib2.X502_PreloadStart(Create)
    #lib2.X502_PrepareData(Create, pyarr, pyarr, 'NULL', size, 0x0002, volt_dac_ok)#
    # lib2.X502_AsyncOutDac(Create, 0, volt_dac_ok, 0x0002)#
   
    for i in range(50):
        lib2.X502_PrepareData(Create, pyarr, 'NULL', 'NULL', size, 0x0002, volt_dac_ok)
        # volt_dac_ok = (ctypes.c_double * len(volt_dac))()#
        # print(type(volt_dac))
        lib2.X502_AsyncOutDac(Create, 0, volt_dac_ok, 0x0002)#
        lib2.X502_StreamsEnable(Create, 0x10)#
        # lib2.X502_Send(Create, volt_dac_ok, size, 10)
        # lib2.X502_Configure(Create, 0)
        # lib2.X502_StreamsStart(Create)

        lib2.X502_OutCycleLoadStart(Create, size)#
        # print(lib2.X502_Send(Create, volt_dac_ok, size, 10))
        lib2.X502_Send(Create, volt_dac_ok, size, 10)#
        lib2.X502_OutCycleSetup(Create, 0x02)#
        lib2.X502_StreamsStart(Create)#
        # lib2.X502_StreamsStop(Create)#

def close():
    lib2.X502_StreamsStop(Create)
    lib2.X502_Close(Create)
    lib2.X502_Free(Create)
# --------------------------------------------------------------------------------
pp = ctypes.pointer(Read_x502())
pp2 = ctypes.pointer(t_x502_info())
coef_dac_list = []###########################################

lib = cdll.LoadLibrary('C:\\work\\laba\\lcard\\e502\\python e502\\e502api.dll')
lib2 = cdll.LoadLibrary('C:\\work\\laba\\lcard\\e502\\python e502\\x502api.dll')

Create = lib2.X502_Create()
print ('Create:', Create)

Open = lib.E502_OpenUsb(Create, 0)  # 0 - конект к первой подключенной плате
print ('Open:', Open)

Info = lib2.X502_GetDevInfo(Create, pp2)
print ('Info:', Info)
print ('BrdName:', pp2.contents.BrdName)
print ('SerNum:', pp2.contents.SerNum)
print ('devflags:', pp2.contents.devflags)
print ('fpga_ver:', pp2.contents.fpga_ver)
print ('plda_ver:', pp2.contents.plda_ver)
print ('board_rev:', pp2.contents.board_rev)
print ('mcu_firmware_ver:', pp2.contents.mcu_firmware_ver)

for ii in range(6):
    print ('-->ADC cbr_offs {}: {}'.format(ii, pp2.contents.cbr.adc[ii].offs))
    print ('-->ADC cbr_koef {}: {}'.format(ii, pp2.contents.cbr.adc[ii].k))

for ii in range(2):
    print ('-->DAC cbr_offs {}: {}'.format(ii, pp2.contents.cbr.dac[ii].offs))
    print ('-->DAC cbr_koef {}: {}'.format(ii, pp2.contents.cbr.dac[ii].k))
    coef_dac_list.append(pp2.contents.cbr.dac[ii].offs)
    coef_dac_list.append(pp2.contents.cbr.dac[ii].k)

lib2.X502_SetSyncMode (Create, 0)
lib2.X502_SetRefFreq(Create, 2000000) #2000000

# ========================= DAC ==========================================
volt_dac = []                  # DC mV 3000
volt_dac = array.array('f', ())     # AC
Um = 2600                           # rms mV
f = 10000 #10000                           # Hz
size = 1000000 #1000000
dac_numb =  0x10                    # 0x10-ЦАП1; 0x20-ЦАП2
for x in range(size):
    # for _ in range(10):###############
    #     volt_dac.append(-6000)##################3
    # for _ in range(10):###############
    #     volt_dac.append(6000)##################3
    #y_sin_analog = (Um * (math.sin(28 * 2 * math.pi * f/ size))) * math.sqrt(2) * (30000 / 5000) #вместо 28 -  икс
    y_sin_analog = 21670.95703125
    for t in range(10):
        volt_dac.append(y_sin_analog)
    for t in range(10):
        volt_dac.append(y_sin_analog * (-1))
    # for _ in range(25000):
    #     volt_dac.append(21670.95703125)
    # for _ in range(25000):
    #     volt_dac.append(-21670.95703125)
# ========================================================================

if __name__ == '__main__':
    for p in range(1):
        dac_synchr()
        print('iteration', p+1)
    close()




Часть кода ниже позволяет реализовать меандр 50 кГц, +-2,5В:
    for t in range(10):
        volt_dac.append(y_sin_analog)
    for t in range(10):
        volt_dac.append(y_sin_analog * (-1))
По сути создается список с переменными противоположными значениями пачками по 10 точек.

При увеличении числа с одним и тем же значением подряд ожидается аналогичный сигнал но с частотой 20 Гц:
    # for _ in range(25000):
    #     volt_dac.append(21670.95703125)
    # for _ in range(25000):
    #     volt_dac.append(-21670.95703125)

Данная часть кода позволяет создать сигнал частотой 20 Гц, но форма меандра исчезает - с указанной частотой на осциллограмме возникают палки без желаемых полочек. И в целом при увеличении количества точек сигнал становится менее похож на меандр и более похож на модулированный ИК сигнал, хотя математически это не ожидается.

Финальным сигналом, который хочется получить, нужен меандр 20Гц, амплитуда 5 В от 0 до 5. Реализовать нужно с помощью питона, для объединения с другими устройствами. Заранее, спасибо!

Контакты

Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2

Многоканальный телефон:
+7 (495) 785-95-25
Факс: +7 (495) 785-95-14

Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru

Время работы: с 9-00 до 19-00 мск