Bug fix: unconsistent changes of match signal caused twitches im motor movement....
authorMartin Prudek <prudemar@fel.cvut.cz>
Thu, 7 May 2015 12:41:05 +0000 (14:41 +0200)
committerMartin Prudek <prudemar@fel.cvut.cz>
Thu, 7 May 2015 12:41:05 +0000 (14:41 +0200)
pmsm-control/rpi_pmsm_control.vhdl

index 27ca4d8..beb4b9c 100644 (file)
@@ -197,6 +197,7 @@ architecture behavioral of rpi_pmsm_control is
        
        signal pwm_match: pwm_res_type;                                 --point of reversion of pwm output, 0 to 2047
        signal pwm_count: std_logic_vector (pwm_width-1 downto 0);      --counter, 0 to 2047
+       signal pwm_sync_at_next: std_logic;
        signal pwm_sync: std_logic;
        signal pwm_en_p: std_logic_vector(1 to 3);
        signal pwm_en_n: std_logic_vector(1 to 3);
@@ -261,7 +262,7 @@ begin
                port map (
                        clock => gpio_clk,                              --50 Mhz clk from gpclk on raspberry
                        sync => pwm_sync,                               --counter restarts
-                       data_valid => income_data_valid,                        
+                       data_valid => pwm_sync_at_next,                 
                        failsafe => failsafe,
                        --
                        -- pwm config bits & match word
@@ -344,8 +345,16 @@ begin
        process
        begin
                wait until (gpio_clk'event and gpio_clk='1');
-               IF(pwm_count = pwm_period) THEN                         
-               --end of period reached
+               IF pwm_count = std_logic_vector(unsigned(pwm_period) - 1) THEN                          
+                       --end of period nearly reached
+                       --fetch new pwm match data
+                       pwm_sync_at_next <= '1';
+               else
+                       pwm_sync_at_next <= '0';
+               end if;
+               
+               if pwm_sync_at_next='1' then
+                       --end of period reached
                        pwm_count <= (others=>'0');      --reset counter
                        pwm_sync <= '1';                                -- inform PWM logic about new period start
                ELSE                                                    --end of period not reached