Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
en:sw:01-mervis:advanced-modes-of-digital-outputs-hidden [2018/06/12 10:05]
martin_kudlacek [The duty cycle]
en:sw:01-mervis:advanced-modes-of-digital-outputs-hidden [2021/04/29 13:15]
avsetula
Line 1: Line 1:
 ====== Advanced mode of digital outputs: PWM ====== ====== Advanced mode of digital outputs: PWM ======
 +<WRAP group 100%>
 +<WRAP half column 81%>
 The PWM stands for Pulse-Width Modulation. It is for generating a square signal of given frequency and certain duty cycle on a digital output. Typically, it is used for regulating a DC powered component in a way the analog regulation cannot achieve. The PWM stands for Pulse-Width Modulation. It is for generating a square signal of given frequency and certain duty cycle on a digital output. Typically, it is used for regulating a DC powered component in a way the analog regulation cannot achieve.
 +</​WRAP>​
 +<WRAP half column 15%>
 +;;#
 +<​html><​span class="​dev-tag dev-patron">​Patron</​span></​html>​ \\
 +<​html><​span class="​dev-tag dev-neuron">​Neuron</​span></​html>​ \\
 +<​html><​span class="​dev-tag dev-axon">​Axon</​span></​html>​
 +;;#
 +</​WRAP>​
 +</​WRAP>​
  
-Let's take a 24V DC motor for example. To achieve 100% RPMs, you have to supply it with 24V. Logically, to achieve 10% RPMs, you have to supply it 24V/10 = 2.4V. But if you apply this voltage, the motor will not even start, because of the friction and its load. And if it starts, its torque will be very low. This is one of many downsides of analogue regulation.+Let's take a 24V DC motor for example. To achieve 100% RPMs, you have to supply it with 24V. Logically, to achieve 10% RPMs, you have to supply it 24V/10 = 2.4V. But if you apply this voltage, the motor will not even start, because of the friction and its load. And if it starts, its torque will be very low. This is one of the downsides of analogue regulation.
  
 The PWM works **only on digital outputs**, that means it can only output 0V or 24V. To achieve the regulation, the PWM generates a square signal of given frequency. That means it will periodically set the output ''​ON''​ and ''​OFF''​. The parameter of the regulation is the **duty cycle** - a proportion of the ''​ON''​ time and ''​OFF''​ time within one period. When the duty cycle is represented in percents and the value is 50%, the output signal will be 50% of the period ''​ON''​ and the rest will be ''​OFF''​. If the duty cycle is 66%, it will be 66% of the cycle ''​ON''​ and 34% ''​OFF''​. The PWM works **only on digital outputs**, that means it can only output 0V or 24V. To achieve the regulation, the PWM generates a square signal of given frequency. That means it will periodically set the output ''​ON''​ and ''​OFF''​. The parameter of the regulation is the **duty cycle** - a proportion of the ''​ON''​ time and ''​OFF''​ time within one period. When the duty cycle is represented in percents and the value is 50%, the output signal will be 50% of the period ''​ON''​ and the rest will be ''​OFF''​. If the duty cycle is 66%, it will be 66% of the cycle ''​ON''​ and 34% ''​OFF''​.
Line 21: Line 32:
 The duty cycle, as mentioned above, is the actual value of the regulation. Typically, you will encounter PWM duty cycle represented as a percentage of the ''​ON''​ time in regard of the period. In the Mervis however, **the duty cycle is represented by the number of resolution steps**. Let's see how to calculate this value. The duty cycle, as mentioned above, is the actual value of the regulation. Typically, you will encounter PWM duty cycle represented as a percentage of the ''​ON''​ time in regard of the period. In the Mervis however, **the duty cycle is represented by the number of resolution steps**. Let's see how to calculate this value.
  
-<​HTML>​ +                           resolution - 1 
-                         resolution - 1 +  duty_cycle [mervis] = ------------------- * duty_cycle [%] 
-duty_cycle [mervis] = ------------------- * duty_cycle [%] +                               ​100
-                              100 +
-</​HTML> ​                        +
  
 <WRAP center round info 80%> <WRAP center round info 80%>
-As you can see, the only correct values of duty_cycle [mervis] ​is between 0 and resolution - 1. These values you will set from the program. ​+The only correct values of duty_cycle [mervis] ​are between 0 and resolution - 1. These values you will set from the program. ​
 </​WRAP>​ </​WRAP>​
  
 === 1. example === === 1. example ===
-resolution = 101 steps (0 - 100% in the step of 1%) 
  
-duty_cycle [%] = 34 +  resolution = 101 steps (0 - 100% in the step of 1%) 
- +   
-<​HTML>​ +  ​duty_cycle [%] = 34 
-                         resolution - 1                           101 - 1 +   
-duty_cycle [mervis] = ------------------- * duty_cycle [%] = ------------------- * 34 = 34 +                           ​resolution - 1                           101 - 1 
-                              100                                   ​100 ​ +  duty_cycle [mervis] = ------------------- * duty_cycle [%] = ------------------- * 34 = 34 
-</​HTML> ​                        +                               ​100                                   ​100 ​
  
 For resolution of 101 steps and desired duty_cycle of 34% we need to set the duty cycle in Mervis to **34**. That was easy, let's try something more complicated. For resolution of 101 steps and desired duty_cycle of 34% we need to set the duty cycle in Mervis to **34**. That was easy, let's try something more complicated.
Line 46: Line 54:
 === 2. example === === 2. example ===
  
-resolution = 6 steps (0 - 100% in the step of 20%) +  ​resolution = 6 steps (0 - 100% in the step of 20%) 
- +   
-duty_cycle [%] = 40% +  duty_cycle [%] = 40% 
- +   
-<​HTML>​ +                          resolution - 1                          6 - 1 
-                         resolution - 1                          6 - 1 +  duty_cycle [mervis] = ------------------- * duty_cycle [%] = -------------- * 40 = 2
-duty_cycle [mervis] = ------------------- * duty_cycle [%] = -------------- * 40 = 2+
                               100                                 ​100 ​                               100                                 ​100 ​
-</​HTML> ​                         
  
 For resolution of 6 steps and desired duty_cycle of 40% we need to set the duty cycle in Mervis to **2**. For resolution of 6 steps and desired duty_cycle of 40% we need to set the duty cycle in Mervis to **2**.
Line 62: Line 68:
 Unfortunatelly,​ you cannot set the **frequency** and the **resolution** values in the Mervis directly. The variables for configuring PWM in Mervis are called **PWM_Cycle** and **PWM_Prescale** and you need to calculate their values according to desired **resolution** and **frequency**:​ Unfortunatelly,​ you cannot set the **frequency** and the **resolution** values in the Mervis directly. The variables for configuring PWM in Mervis are called **PWM_Cycle** and **PWM_Prescale** and you need to calculate their values according to desired **resolution** and **frequency**:​
  
-<​HTML>​ +  ​PWM_Cycle = resolution - 2 
-PWM_Cycle = resolution - 2 +   
-</​HTML>​ +                            4.8 * 10^7 
- +  PWM_Prescale = ------------------------------- - 1 
-<​HTML>​ +                  frequency * ( resolution - 1)     
-                          4.8 * 10^7 +
-PWM_Prescale = ------------------------------- - 1 +
-                frequency * ( resolution - 1)      +
-</​HTML>​+
  
 <WRAP center round tip 80%> <WRAP center round tip 80%>
Line 78: Line 80:
 Alternatively,​ to get the **resolution** and **frequency** from **PWM_Cycle** and **PWM_Prescale** values, use these equations: ​ Alternatively,​ to get the **resolution** and **frequency** from **PWM_Cycle** and **PWM_Prescale** values, use these equations: ​
  
-<​HTML>​ +  ​resolution = PWM_Cycle + 2 
-resolution = PWM_Cycle + 2 +   
-</​HTML>​ +                           ​4.8 * 10^7 
- +  frequency = ----------------------------------------  
-<​HTML>​ +               ​( PWM_Cycle + 1) * (PWM_Prescale + 1)     
-                         ​4.8 * 10^7 +
-frequency = ----------------------------------------  +
-             ​( PWM_Cycle + 1) * (PWM_Prescale + 1)      +
-</​HTML>​+
  
 === 1. example === === 1. example ===
  
-Resolution = 11 (duty cycle 0 - 100% with 10% steps) +  ​Resolution = 11 (duty cycle 0 - 100% with 10% steps) 
- +   
-Frequency = 4kHz +  Frequency = 4kHz 
- +   
-<​HTML>​ +  PWM_Cycle = resolution - 2 = 11 - 2 = 9 
-PWM_Cycle = resolution - 2 = 11 - 2 = 9 +   
-</​HTML>​ +                            4.8 * 10^7                      4.8 * 10^7 
- +  PWM_Prescale = ------------------------------- - 1 = --------------------- - 1 = 1199 
-<​HTML>​ +                  frequency * ( resolution - 1)          4000 * ( 11 - 1 ) 
-                          4.8 * 10^7                      4.8 * 10^7 +
-PWM_Prescale = ------------------------------- - 1 = --------------------- - 1 = 1199 +
-                frequency * ( resolution - 1)          4000 * ( 11 - 1 )  +
-</​HTML>​+
  
 === 2. example === === 2. example ===
  
-Resolution = 41 (step 2.5%) +  ​Resolution = 41 (step 2.5%) 
- +   
-Frequency = 0.1Hz +  Frequency = 0.1Hz 
- +   
-<​HTML>​ +  PWM_Cycle = resolution - 2 = 41 - 2 = 39 
-PWM_Cycle = resolution - 2 = 41 - 2 = 39 +   
-</​HTML>​ +                            4.8 * 10^7                      4.8 * 10^7 
- +  PWM_Prescale = ------------------------------- - 1 = ------------------- - 1 = 119999999 
-<​HTML>​ +                  frequency * ( resolution - 1)          0.1 * (41 - 1 ) 
-                          4.8 * 10^7                      4.8 * 10^7 +
-PWM_Prescale = ------------------------------- - 1 = ------------------- - 1 = 12.631 * 10^6 +
-                frequency * ( resolution - 1)          0.1 * (39 - 1 )  +
-</​HTML>​+
  
 <WRAP center round tip 60%> <WRAP center round tip 60%>
Line 126: Line 116:
 === 3. example === === 3. example ===
  
-Resolution = 10001 (step 0.01%) +  ​Resolution = 10001 (step 0.01%) 
- +   
-Frequency = 0.1Hz +  Frequency = 0.1Hz 
- +   
-<​HTML>​ +  PWM_Cycle = resolution - 2 = 10001 - 2 = 9999 
-PWM_Cycle = resolution - 2 = 10001 - 2 = 9999 +   
-</​HTML>​ +                            4.8 * 10^7                        4.8 * 10^7 
- +  PWM_Prescale = ------------------------------- - 1 = ------------------------- - 1 = 47999 
-<​HTML>​ +                  frequency * ( resolution - 1)            0.1 * (10001 - 1 ) 
-                          4.8 * 10^7                        4.8 * 10^7 +
-PWM_Prescale = ------------------------------- - 1 = ------------------------- - 1 = 47999 +
-                frequency * ( resolution - 1)            0.1 * (10001 - 1 )  +
-</​HTML>​+
  
 <WRAP center round tip 60%> <WRAP center round tip 60%>
Line 149: Line 135:
 {{ :​en:​sw:​01-mervis:​pwm-01-selecting-module.png?​direct |}} {{ :​en:​sw:​01-mervis:​pwm-01-selecting-module.png?​direct |}}
  
-After each setting ​of the configurationyou need to download the configuration into the module. ​Right click on the module ​name in the **Left panel** and select ​the **UniPi - Configure ​module** option.+The change has been done on the prototype ​of the devicewhich means it is a change in the PLC module's configurationTo upload ​the configuration,​ check the [[en:​sw:​01-mervis:​unipi-configure-module-hidden|Configuration of the UniPi module]] tutorial.
  
-{{ :​en:​sw:​01-mervis:​pwm-02-configure-module.png?​direct |}} +Now let's check which variables we have available for working with PWM. Select the **Variable browser** tab on the **Main window**. Under the **Name** column, enter the **PWM** into the search box. You should see similar list.
- +
-For configuration of the module, the PLC has to be in **Commissioning mode**. If not, the Mervis IDE will warn you and automatically switch to the mode. If so, just confirm the dialog by clicking on **Next >**. +
- +
-{{ :​en:​sw:​01-mervis:​pwm-03-confirming-commisioning-mode.png?​direct |}} +
- +
-The dialog with progress of the configuration will appear. +
- +
-{{ :​en:​sw:​01-mervis:​pwm-04-executing-command.png?​direct |}} +
- +
-And after the finishing of the configuration,​ you can confirm the dialog by clicking on **OK**. +
- +
-{{ :​en:​sw:​01-mervis:​pwm-05-executing-finished.png?​direct |}} +
- +
-Let's check which variables we have available for working with PWM. Select the **Variable browser** tab on the **Main window**. Under the **Name** column, enter the **PWM** into the search box. You should see similar list.+
  
 {{ :​en:​sw:​01-mervis:​pwm-06-searching-for-ports.png?​direct |}} {{ :​en:​sw:​01-mervis:​pwm-06-searching-for-ports.png?​direct |}}
  
-Turn on the **Debugging** and in the column **PLC Value**, you will see the current PWM value of DO ports 1.01 - 1.04. If you didn't change it previously, you should see zeros. Change the value of **PWM_1.01** to 50 and confirm by clicking on **V** or submiting with **ENTER**.+Turn on the **Debugging** and in the column **PLC Value**, you will see the current PWM value of DO ports 1.01 - 1.04. If you didn't change it previously, you should see zeros. Change the value of **PWM_1.01** to 50 and confirm by clicking on {{:​files:​dialog-confirm_button_2.png?​nolink|}} ​or submiting with **ENTER**.
  
 We can hook up the oscilloscope to the UniPi'​s DO 1.01 and check the waveform. We can hook up the oscilloscope to the UniPi'​s DO 1.01 and check the waveform.
Line 176: Line 148:
  
 And we can see the frequency of the wave is 4kHz with 50% duty cycle. And we can see the frequency of the wave is 4kHz with 50% duty cycle.
- + 
 +===== What is the magical 4.8 * 10^7 constant? ===== 
 +In calculations of the **PWM_Prescale**,​ we use constant 4.8 * 10^7. The constant represents 48MHz clock source for the internal timers/​counters which together with PWM_Prescale and PWM_Count set the desired frequency