PiCtory settings for MIO pwm output

Topics about the Hardware of Revolution Pi
Post Reply
Makoto G
Posts: 15
Joined: 11 Oct 2022, 06:11

PiCtory settings for MIO pwm output

Post by Makoto G »

I'm going to PWM control a servo motor using the RevPi MIO's digital output.
I have a rudimentary question about the RevPi MIO setup, as it was not included in the tutorial.

In the "Value Editor" of PiCtory, the PWM frequency is set to FpwmOut_12, 3, 4.
Should the value set to FpwmOut be the value of x in the formula f=(2*fp)/(1000*(x+1))?
For example, if I want 200Hz in FpwmOut_12, is it correct to set x=299 or input 200(Hz)?

Thank you in advance.
User avatar
dirk
KUNBUS
Posts: 2111
Joined: 15 Dec 2016, 13:19

Re: PiCtory settings for MIO pwm output

Post by dirk »

Hi Makoto G,
okay lets have a look at the tutorial which I found here:
https://revolutionpi.com/tutorials/digi ... urieren-2/
So here is the formula to set up the PWM :roll: well it's software for those who really love working with formulas ... damm I should have done that algebra homework during studying ...
The possible frequencies follow the formula f=(2*fp)/(1000*(x+1)). fp is 30 MHz for GPO1&2 and 60 MHz for GPO3&4.
This results in maximum frequencies of 60 kHz (GPO1&2) and 120 kHz (GPO3&4). When x_max=65535, minimum frequencie60s of 2 Hz (GPO1&2) and 1 Hz (GPO3&4) are the result.
DIO PWM 200Hz
DIO PWM 200Hz
MIO PWM 200 Hz.jpg (61.93 KiB) Viewed 5404 times
So if you divide my result by 1000 it equals your value! I hope that this helps for the moment.
To round it up a MIO PWM 200Hz with 50% duty cycle should be configured using these values:
  • IO_Mode_1 = 5 [Output-Pwm]
  • FpwmOut_12 = [299]
  • PWM Dutycycle_1 = 500 [50%]
Makoto G
Posts: 15
Joined: 11 Oct 2022, 06:11

Re: PiCtory settings for MIO pwm output

Post by Makoto G »

Thank you for your response.
I configured PiCtory as follows
-IO_Mode_1 = pwmOut
-FpwmOut_12 = 299 [200Hz].
-PWM Dutycycle_1 = 304 [30.4%]

I have an another question.
Maybe I should move it to the RevPiModIO board, but since it's a continuing question, I'll put it here.

I want to use RevPiModIO2 to control the Duty ratio of DigitalOutput_1 of RevPi MIO for servo motor control.
I referred to some threads, but there was no case of MIO module, so I don't know if the python code I wrote is correct.
Since I don't have the equipment to check the PWM waveforms directly, can you please take a look at my python code to see if there are any problems with it?
The python code is given below.

Thank you in advance.

-----------------------------------------------------------------------------------------------------
import revpimodio2
import time

rpi = revpimodio2.RevPiModIO(autorefresh=True)

rpi.io.PwmDutycycle_1.value = int(496)#49.6% duty cycle
rpi.io.DigitalOutput_1.value = int(1)
time.sleep(15)

rpi.io.PwmDutycycle_1.value = int(112)#11.2% duty cycle
rpi.io.DigitalOutput_1.value = int(1)
time.sleep(15)

rpi.io.DigitalOutput_1.value = int(0)
-----------------------------------------------------------------------------------------------------
u.biakoup
KUNBUS
Posts: 208
Joined: 14 Apr 2022, 13:04

Re: PiCtory settings for MIO pwm output

Post by u.biakoup »

Hi Makoto,
I have looked at your code. I have made some changes, but I don't know if the code does what you want to test correctly.
In general, you need to consider whether you want a cyclic (classic in automation) or an event-based program. The simplest is cyclic:

Code: Select all

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import revpimodio2

def main(ct: revpimodio2.Cycletools) -> None:

        ct.io.PwmDutycycle_1.value = 496
        ct.io.DigitalOutput_1.value = True

        ct.io.PwmDutycycle_1.value = 112
        ct.io.DigitalOutput_1.value = True

        ct.io.DigitalOutput_1.value = False

# Start the cycle program, which will run every 50 milliseconds
revpimodio2.run_plc(main)

User avatar
RevPiModIO
KUNBUS
Posts: 327
Joined: 20 Jan 2017, 08:44
Contact:

Re: PiCtory settings for MIO pwm output

Post by RevPiModIO »

Hi Makoto!

In general your Python code is okay. Just add the rpi.exit() at the end to be sure all IOs are set as you want - Especially the .value = int(0)

Code: Select all

import revpimodio2
import time

rpi = revpimodio2.RevPiModIO(autorefresh=True)

rpi.io.PwmDutycycle_1.value = int(496)  #49.6% duty cycle
rpi.io.DigitalOutput_1.value = True
time.sleep(15)

rpi.io.PwmDutycycle_1.value = int(112)  #11.2% duty cycle
rpi.io.DigitalOutput_1.value = True
time.sleep(15)

rpi.io.DigitalOutput_1.value = False

# Make sure to write all output values before program ends
rpi.exit()
So This program will set the Dudycycle to 496, set the DigitalOutput_1 to True, waits 15 seconds, set DutyCycle to 112, keep DigitalOutput_1 at True, waits 15 seconds, set DigitalOutput_1 to False, exit program.

Sven
python3-RevPiModIO - https://revpimodio.org/ || Der RevPi ist das Beste, was passieren konnte!
Post Reply