Здравствуйте! Используемая версия 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. Реализовать нужно с помощью питона, для объединения с другими устройствами. Заранее, спасибо!