Skip to content

Commit

Permalink
Complemento para periférico SPWM (#74)
Browse files Browse the repository at this point in the history
* Add files via upload

* Delete peripherals/spwm/testbench_spwm.vdh.vhd

* Add files via upload

* Complementando periférico SPWM

* Complementando periférico SPWM

* Complementando periférico SPWM

* Complementando periférico SPWM
  • Loading branch information
RamonSerafim authored Sep 10, 2024
1 parent d24fbc7 commit c00b34f
Show file tree
Hide file tree
Showing 12 changed files with 2,446 additions and 49 deletions.
52 changes: 47 additions & 5 deletions peripherals/spwm/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,15 @@ Implementação de um componente VHDL gerador de PWM senoidal a partir da compar

- `reset`: sinal de reset do periférico, deve ser conectado ao barramento do `reset` do _core_.

- `sine_spwm`: Saída do pwm senoidal gerado pelo hardware
- `sel_modulation`: Seleciona qual modulação será apresentada na saída.

- `sine_spwm1`: Saída 1 do pwm senoidal gerado pelo hardware.

- `sine_spwm2`: Saída 2 do pwm senoidal gerado pelo hardware.

- `sine_spwm3`: Saída 3 do pwm senoidal gerado pelo hardware.

- `sine_spwm4`: Saída 4 do pwm senoidal gerado pelo hardware.


## Funcionamento
Expand All @@ -19,14 +27,48 @@ Os valores da portadora são atualizados a partir de uma tabela de valores da se

O valor da moduladora segue a lógica de uma onda triangular de acordo com o valor de contagem máxima e uma variável de fator de multiplicação para que possa ser implementada modulação de amplitude.

É feita a comparaçao entre portadora e moduladora e o sinal pwm é gerado na saída sine_spwm. Observe abaixo a lógica implementada e o exemplo simulado via PSIM.
É feita a comparaçao entre portadora e moduladora e o sinal pwm é gerado nas saídas sine_spwm. É possível selecionar qual modulação será escolhida, Bipolar ou Unipolar.

Observe abaixo a lógica implementada e o exemplo simulado via PSIM.

## Modulação Bipolar

- sine_spwm = 1 quando Vseno > Vtriangular
- sine_spwm = 0 quando Vseno < Vtriangular
- sine_spwm1 = 1 quando Vseno > Vtriangular
- sine_spwm1 = 0 quando Vseno < Vtriangular

<p align="center">
<img src="https://github.com/xtarke/riscv-multicycle/blob/master/peripherals/spwm/spwm_example.png" width="436" height="326">

Em uma aplicação para inversores monofásicos utilizamos 4 chaves, precisamos apenas de 1 sinal comparado com a tabela e seu complementar. A disposição das chaves ficam exemplificados abaixo:


- Chave 1 = Chave 3 = sine_spwm1 = sine_spwm3
- Chave 2 = Chave 4 = sine_spwm2 = sine_spwm4

## Modulação Unipolar

O modelo de chaveamento segue da mesma forma que a modulação bipolar, porém agora com um sinal defasado.

- sine_spwm1 = 1 quando Vseno > Vtriangular
- sine_spwm1 = 0 quando Vseno < Vtriangular
- sine_spwm2 = 1 quando Vseno_offset > Vtriangular
- sine_spwm2 = 0 quando Vseno_offset < Vtriangular

<p align="center">
<img src="https://github.com/RamonSerafim/riscv-multicycle/blob/master/peripherals/spwm/spwm_example_unipolar.png" width="436" height="326">



Em uma aplicação para inversores monofásicos utilizamos 4 chaves, precisamos de 2 sinais comparado com a tabela e seus complementares. A primeira tabela disponibilizando 1 sinal e seu complementar e a outra tabela sendo defasada 180º da primeira, tendo como resposta 1 sinal e seu complementar A disposição das chaves ficam exemplificados abaixo:




- Chave 1 = sine_spwm1 = a partir de table_sine
- Chave 2 = sine_spwm2 = a partir de table_sine_offset
- Chave 3 = sine_spwm3 = complementar de sine_spwm1
- Chave 4 = sine_spwm4 = complementar de sine_spwm2

## Simulação

Os valores a seguir foram gerados no Questa utilizando os arquivos de testbench e também o exemplo de software main_spwm.c encontrado nesse repositório, no caminho software/spwm/.
Expand All @@ -44,4 +86,4 @@ Foi aplicado um zoom para mostrar os valores das ondas de referência e portador
## Sugestões
- Testar lógica de modulação de amplitude
- Adequar o componente para N saídas e com a lógica de chaveamento para - aplicação. Exemplos: conversor B6, inversor monofásico
- Gerar a tabela de valores da senoide em tempo de compilação
- Gerar a tabela de valores da senoide em tempo de compilação
102 changes: 102 additions & 0 deletions peripherals/spwm/sine_values.txt
Original file line number Diff line number Diff line change
Expand Up @@ -98,3 +98,105 @@
-6140, -5938, -5735, -5532, -5329, -5126, -4922, -4719, -4515, -4311,
-4107, -3902, -3698, -3493, -3289, -3084, -2879, -2673, -2468, -2263,
-2057, -1852, -1646, -1441, -1235, -1029, -823, -618, -412, -206]

Tabela defasada 90 graus
[ 0, -206, -412, -618, -823, -1029, -1235, -1441, -1646, -1852,
-2057, -2263, -2468, -2673, -2879, -3084, -3289, -3493, -3698, -3902,
-4107, -4311, -4515, -4719, -4922, -5126, -5329, -5532, -5735, -5938,
-6140, -6342, -6544, -6746, -6947, -7148, -7349, -7549, -7749, -7949,
-8149, -8348, -8547, -8746, -8944, -9142, -9339, -9536, -9733, -9930,
-10126,-10321,-10516,-10711,-10905,-11099,-11293,-11486,-11679,-11871,
-12062,-12254,-12444,-12634,-12824,-13013,-13202,-13390,-13578,-13765,
-13952,-14138,-14323,-14508,-14692,-14876,-15059,-15242,-15424,-15605,
-15786,-15966,-16145,-16324,-16502,-16680,-16857,-17033,-17208,-17383,
-17557,-17731,-17904,-18076,-18247,-18418,-18588,-18757,-18925,-19093,
-19260,-19426,-19592,-19756,-19920,-20083,-20245,-20407,-20568,-20727,
-20886,-21045,-21202,-21359,-21514,-21669,-21823,-21976,-22129,-22280,
-22431,-22580,-22729,-22877,-23024,-23170,-23315,-23459,-23602,-23745,
-23886,-24027,-24166,-24305,-24442,-24579,-24715,-24849,-24983,-25116,
-25247,-25378,-25508,-25637,-25764,-25891,-26017,-26141,-26265,-26388,
-26509,-26630,-26749,-26867,-26985,-27101,-27216,-27330,-27443,-27555,
-27666,-27776,-27885,-27992,-28099,-28204,-28308,-28411,-28513,-28614,
-28714,-28813,-28910,-29006,-29102,-29196,-29289,-29380,-29471,-29560,
-29648,-29736,-29821,-29906,-29990,-30072,-30153,-30233,-30312,-30390,
-30466,-30541,-30615,-30688,-30759,-30830,-30899,-30967,-31034,-31099,
-31163,-31226,-31288,-31349,-31408,-31466,-31523,-31578,-31633,-31686,
-31738,-31788,-31837,-31886,-31932,-31978,-32022,-32065,-32107,-32147,
-32187,-32225,-32261,-32297,-32331,-32364,-32395,-32425,-32454,-32482,
-32509,-32534,-32558,-32580,-32602,-32622,-32640,-32658,-32674,-32689,
-32702,-32715,-32726,-32735,-32744,-32751,-32757,-32761,-32764,-32766,
-32767,-32766,-32764,-32761,-32757,-32751,-32744,-32735,-32726,-32715,
-32702,-32689,-32674,-32658,-32640,-32622,-32602,-32580,-32558,-32534,
-32509,-32482,-32454,-32425,-32395,-32364,-32331,-32297,-32261,-32225,
-32187,-32147,-32107,-32065,-32022,-31978,-31932,-31886,-31837,-31788,
-31738,-31686,-31633,-31578,-31523,-31466,-31408,-31349,-31288,-31226,
-31163,-31099,-31034,-30967,-30899,-30830,-30759,-30688,-30615,-30541,
-30466,-30390,-30312,-30233,-30153,-30072,-29990,-29906,-29821,-29736,
-29648,-29560,-29471,-29380,-29289,-29196,-29102,-29006,-28910,-28813,
-28714,-28614,-28513,-28411,-28308,-28204,-28099,-27992,-27885,-27776,
-27666,-27555,-27443,-27330,-27216,-27101,-26985,-26867,-26749,-26630,
-26509,-26388,-26265,-26141,-26017,-25891,-25764,-25637,-25508,-25378,
-25247,-25116,-24983,-24849,-24715,-24579,-24442,-24305,-24166,-24027,
-23886,-23745,-23602,-23459,-23315,-23170,-23024,-22877,-22729,-22580,
-22431,-22280,-22129,-21976,-21823,-21669,-21514,-21359,-21202,-21045,
-20886,-20727,-20568,-20407,-20245,-20083,-19920,-19756,-19592,-19426,
-19260,-19093,-18925,-18757,-18588,-18418,-18247,-18076,-17904,-17731,
-17557,-17383,-17208,-17033,-16857,-16680,-16502,-16324,-16145,-15966,
-15786,-15605,-15424,-15242,-15059,-14876,-14692,-14508,-14323,-14138,
-13952,-13765,-13578,-13390,-13202,-13013,-12824,-12634,-12444,-12254,
-12062,-11871,-11679,-11486,-11293,-11099,-10905,-10711,-10516,-10321,
-10126, -9930, -9733, -9536, -9339, -9142, -8944, -8746, -8547, -8348,
-8149, -7949, -7749, -7549, -7349, -7148, -6947, -6746, -6544, -6342,
-6140, -5938, -5735, -5532, -5329, -5126, -4922, -4719, -4515, -4311,
-4107, -3902, -3698, -3493, -3289, -3084, -2879, -2673, -2468, -2263,
-2057, -1852, -1646, -1441, -1235, -1029, -823, -618, -412, -206,
0, 206, 412, 618, 823, 1029, 1235, 1441, 1646, 1852,
2057, 2263, 2468, 2673, 2879, 3084, 3289, 3493, 3698, 3902,
4107, 4311, 4515, 4719, 4922, 5126, 5329, 5532, 5735, 5938,
6140, 6342, 6544, 6746, 6947, 7148, 7349, 7549, 7749, 7949,
8149, 8348, 8547, 8746, 8944, 9142, 9339, 9536, 9733, 9930,
10126, 10321, 10516, 10711, 10905, 11099, 11293, 11486, 11679, 11871,
12062, 12254, 12444, 12634, 12824, 13013, 13202, 13390, 13578, 13765,
13952, 14138, 14323, 14508, 14692, 14876, 15059, 15242, 15424, 15605,
15786, 15966, 16145, 16324, 16502, 16680, 16857, 17033, 17208, 17383,
17557, 17731, 17904, 18076, 18247, 18418, 18588, 18757, 18925, 19093,
19260, 19426, 19592, 19756, 19920, 20083, 20245, 20407, 20568, 20727,
20886, 21045, 21202, 21359, 21514, 21669, 21823, 21976, 22129, 22280,
22431, 22580, 22729, 22877, 23024, 23170, 23315, 23459, 23602, 23745,
23886, 24027, 24166, 24305, 24442, 24579, 24715, 24849, 24983, 25116,
25247, 25378, 25508, 25637, 25764, 25891, 26017, 26141, 26265, 26388,
26509, 26630, 26749, 26867, 26985, 27101, 27216, 27330, 27443, 27555,
27666, 27776, 27885, 27992, 28099, 28204, 28308, 28411, 28513, 28614,
28714, 28813, 28910, 29006, 29102, 29196, 29289, 29380, 29471, 29560,
29648, 29736, 29821, 29906, 29990, 30072, 30153, 30233, 30312, 30390,
30466, 30541, 30615, 30688, 30759, 30830, 30899, 30967, 31034, 31099,
31163, 31226, 31288, 31349, 31408, 31466, 31523, 31578, 31633, 31686,
31738, 31788, 31837, 31886, 31932, 31978, 32022, 32065, 32107, 32147,
32187, 32225, 32261, 32297, 32331, 32364, 32395, 32425, 32454, 32482,
32509, 32534, 32558, 32580, 32602, 32622, 32640, 32658, 32674, 32689,
32702, 32715, 32726, 32735, 32744, 32751, 32757, 32761, 32764, 32766,
32767, 32766, 32764, 32761, 32757, 32751, 32744, 32735, 32726, 32715,
32702, 32689, 32674, 32658, 32640, 32622, 32602, 32580, 32558, 32534,
32509, 32482, 32454, 32425, 32395, 32364, 32331, 32297, 32261, 32225,
32187, 32147, 32107, 32065, 32022, 31978, 31932, 31886, 31837, 31788,
31738, 31686, 31633, 31578, 31523, 31466, 31408, 31349, 31288, 31226,
31163, 31099, 31034, 30967, 30899, 30830, 30759, 30688, 30615, 30541,
30466, 30390, 30312, 30233, 30153, 30072, 29990, 29906, 29821, 29736,
29648, 29560, 29471, 29380, 29289, 29196, 29102, 29006, 28910, 28813,
28714, 28614, 28513, 28411, 28308, 28204, 28099, 27992, 27885, 27776,
27666, 27555, 27443, 27330, 27216, 27101, 26985, 26867, 26749, 26630,
26509, 26388, 26265, 26141, 26017, 25891, 25764, 25637, 25508, 25378,
25247, 25116, 24983, 24849, 24715, 24579, 24442, 24305, 24166, 24027,
23886, 23745, 23602, 23459, 23315, 23170, 23024, 22877, 22729, 22580,
22431, 22280, 22129, 21976, 21823, 21669, 21514, 21359, 21202, 21045,
20886, 20727, 20568, 20407, 20245, 20083, 19920, 19756, 19592, 19426,
19260, 19093, 18925, 18757, 18588, 18418, 18247, 18076, 17904, 17731,
17557, 17383, 17208, 17033, 16857, 16680, 16502, 16324, 16145, 15966,
15786, 15605, 15424, 15242, 15059, 14876, 14692, 14508, 14323, 14138,
13952, 13765, 13578, 13390, 13202, 13013, 12824, 12634, 12444, 12254,
12062, 11871, 11679, 11486, 11293, 11099, 10905, 10711, 10516, 10321,
10126, 9930, 9733, 9536, 9339, 9142, 8944, 8746, 8547, 8348,
8149, 7949, 7749, 7549, 7349, 7148, 6947, 6746, 6544, 6342,
6140, 5938, 5735, 5532, 5329, 5126, 4922, 4719, 4515, 4311,
4107, 3902, 3698, 3493, 3289, 3084, 2879, 2673, 2468, 2263,
2057, 1852, 1646, 1441, 1235, 1029, 823, 618, 412, 206]
3 changes: 2 additions & 1 deletion peripherals/spwm/sint/de10_lite/de10_lite.qsf
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ set_global_assignment -name DEVICE 10M50DAF484C7G
set_global_assignment -name TOP_LEVEL_ENTITY de10_lite
set_global_assignment -name ORIGINAL_QUARTUS_VERSION 15.0.0
set_global_assignment -name PROJECT_CREATION_TIME_DATE "18:49:34 JUNE 20, 2019"
set_global_assignment -name LAST_QUARTUS_VERSION "21.1.1 Lite Edition"
set_global_assignment -name LAST_QUARTUS_VERSION "21.1.1 Standard Edition"
set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files
set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0
set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85
Expand Down Expand Up @@ -241,4 +241,5 @@ set_global_assignment -name VHDL_FILE de10_lite.vhd
set_global_assignment -name QIP_FILE pll.qip
set_global_assignment -name SOURCE_FILE db/de10_lite.cmp.rdb
set_global_assignment -name VHDL_FILE ../../../gpio/led_displays.vhd
set_global_assignment -name MIF_FILE output_files/tabela_seno.mif
set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top
33 changes: 25 additions & 8 deletions peripherals/spwm/sint/de10_lite/de10_lite.vhd
Original file line number Diff line number Diff line change
Expand Up @@ -123,8 +123,11 @@ architecture rtl of de10_lite is
signal ddata_r_dig_fil : std_logic_vector(31 downto 0);
signal ddata_r_stepmot : std_logic_vector(31 downto 0);
signal ddata_r_lcd : std_logic_vector(31 downto 0);
signal ddata_r_nn_accelerator : std_logic_vector(31 downto 0);
signal ddata_r_fir_fil : std_logic_vector(31 downto 0);
signal ddata_r_nn_accelerator : std_logic_vector(31 downto 0);
signal ddata_r_fir_fil : std_logic_vector(31 downto 0);
signal ddata_r_crc : std_logic_vector(31 downto 0);
signal ddata_r_key : std_logic_vector(31 downto 0);
signal ddata_r_accelerometer : std_logic_vector(31 downto 0);

-- Interrupt Signals
signal interrupts : std_logic_vector(31 downto 0);
Expand All @@ -133,8 +136,12 @@ architecture rtl of de10_lite is

-- I/O signals
signal input_in : std_logic_vector(31 downto 0);

signal switching_sine : std_logic;

--Timer
signal ifcap : std_logic ; -- capture flag

signal sel_modulation : std_logic;

begin

Expand Down Expand Up @@ -174,7 +181,11 @@ begin
port map(
clock => clk_50MHz,
reset => rst,
sel_modulation => SW(5),
sine_pwm1 => ARDUINO_IO(0),
sine_pwm2 => ARDUINO_IO(2),
sine_pwm3 => ARDUINO_IO(4),
sine_pwm4 => ARDUINO_IO(6),
daddress => daddress,
ddata_w => ddata_w,
ddata_r => ddata_r_spwm,
Expand Down Expand Up @@ -217,6 +228,7 @@ begin
-- 0x20000 -> Data memory
-- 0x40000 -> Input/Output generic address space
-- ( ... ) -> ( ... )

datamux: entity work.databusmux
port map(
dcsel => dcsel,
Expand Down Expand Up @@ -263,10 +275,14 @@ begin
ddata_r_periph => ddata_r_periph,
ddata_r_spwm => ddata_r_spwm,
ddata_r_dif_fil => ddata_r_dig_fil,
ddata_r_stepmot => ddata_r_stepmot,
ddata_r_lcd => ddata_r_lcd,
ddata_r_fir_fil => ddata_r_fir_fil,
ddata_r_nn_accelerator => ddata_r_nn_accelerator
ddata_r_stepmot => ddata_r_stepmot,
ddata_r_lcd => ddata_r_lcd,
ddata_r_fir_fil => ddata_r_fir_fil,
ddata_r_nn_accelerator => ddata_r_nn_accelerator,
ddata_r_crc => ddata_r_crc,
ddata_r_key => ddata_r_key,
ddata_r_accelerometer => ddata_r_accelerometer

);

generic_gpio: entity work.gpio
Expand Down Expand Up @@ -301,7 +317,8 @@ begin
d_rd => d_rd,
dcsel => dcsel,
dmask => dmask,
timer_interrupt => timer_interrupt
timer_interrupt => timer_interrupt,
ifcap => ifcap
);

generic_displays : entity work.led_displays
Expand Down
Loading

0 comments on commit c00b34f

Please sign in to comment.