Задача ЦОС на примере модели сигма-дельта аналого-цифрового преобразователя
В данном примере реализована модель сигма-дельта аналого-цифрового преобразователя (Sigma-Delta ADC) - это тип, который использует метод дельта-сигма модуляции для достижения высокой точности и разрешения в измерении аналоговых сигналов. Он широко применяется в различных приложениях, требующих высокой точности измерения, таких как: аудио, измерительные датчики и т.д. (модель sigma_delta_adc.engee):
Далее в данном примере проанализирована работа Sigma-Delta ADC в Simulink и Engee, а также выполнено сравнение результатов работы двух сред разработки.
Для начала необходимо подключить библиотеки:
# Подключение библиотек
using Plots
using CSV
using DataFrames
using Statistics
plotlyjs();
Запуск модели, реализованной в среде разработки Engee.
modelName = "sigma_delta_adc"
SDC_model = modelName in [m.name for m in engee.get_all_models()] ? engee.open( modelName ) : engee.load( "$(@__DIR__)/$(modelName).engee");
results = engee.run( modelName )
Dict{String, DataFrame} with 3 entries:
"analog" => 51201×2 DataFrame…
"SD_ADC" => 801×2 DataFrame…
"diff" => 51201×2 DataFrame…
Визуализация выходов модели
SD_ADC_res_t = results["SD_ADC"].time;
SD_ADC_res_d = results["SD_ADC"].value;
p_adc_da_sl = plot(SD_ADC_res_t, SD_ADC_res_d, legend = false) # Построение графика
plot!(title = "Результаты моделирования в Engee", ylabel = "Цифровой сигнал", xlabel="Время, c") # Подпись осей и заголовка графика
Результаты моделирования в Simulink:
using MATLAB # Подключение ядра MATLAB
mat"cd $(@__DIR__)"
mat"""
out = sim('sigma_delta_adc');
sig = getElement(out.yout,1);
$DA_times = sig.Values.Time;
$DA_values = sig.Values.Data;
"""; # Запуск Simulink
>> >> >> [Warning: The specified buffer for 'sigma_delta_adc/Transport Delay' was too
small. During simulation, the buffer size was temporarily increased to 3072. In
order to generate code, you need to update the buffer size parameter]
p_adc_da_sl = plot(DA_times, DA_values, legend = false)
plot!(title = "Результаты моделирования в Simulink", ylabel = "Цифровой сигнал", xlabel="Время, c")
В моделях используется решатель с переменным шагом. Необходимо "синхронизировать" сигналы. Сначала, наложим графики друг на друга:
plot(SD_ADC_res_t ,SD_ADC_res_d, label = "Engee")
plot!(title = "Сравнение результатов моделирования")
plot!(DA_times, DA_values, label = "Simulink")
#plot!(label = ["Engee" "Simulink"])
plot!(legend = :outertopright,ylabel = "Цифровой сигнал", xlabel="Время, c")
Находим пересечение двух векторов с временем симуляции:
DA_times = DA_times[1:length(SD_ADC_res_t)];
DA_values = DA_values[1:length(SD_ADC_res_d)];
isect_idx = findall(in(SD_ADC_res_t),DA_times);
Затем, необходимо получить значения в общих точках
sd_comp_t = DA_times[isect_idx];
sd_comp_sl = DA_values[isect_idx];
sd_comp_en = SD_ADC_res_d[isect_idx];
Теперь мы можем корректно сравнить результаты Simulink и Engee:
adc_abs_tol = sd_comp_sl - sd_comp_en;
mean_adc_tol = abs(mean(adc_abs_tol));
adc_rel_tol = (sd_comp_sl - sd_comp_en)./sd_comp_sl;
mean_adc_tol_rel = abs(mean(filter(!isnan,adc_rel_tol)));
println("Средняя абсолютная погрешность вычислений:", mean_adc_tol);
println("Средняя относительная погрешность вычислений, %:", abs(mean_adc_tol_rel*100));
Средняя абсолютная погрешность вычислений:3.643855761728174e-18
Средняя относительная погрешность вычислений, %:9.729906822505499e-15
engee.close( modelName, force=true);
Вывод
Подводя итоги, в данном примере реализована модель сигма-дельта аналого-цифрового преобразователя. Опираясь на данный пример можно сделать несколько выводов:
-
Engee не уступает по точности Simulink
-
Engee позволяет пользоваться МОП, а благодаря большой библиотеке блоков мы имеем возможность реализовать большой функционал блоков.
-
А также, при недостаточности функционала Engee, мы можем воспользоваться функционалом MATLAB внутри Engee