Difference between revisions of "EBC Exercise 13 Pulse Width Modulation"
m (Added Analytics) |
(→Pulse Width Modulation) |
||
(37 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
[[Category:EmbeddedBeagleClass]] | [[Category:EmbeddedBeagleClass]] | ||
[[Category:ECE497]] | [[Category:ECE497]] | ||
− | + | {{YoderHead}} | |
+ | {{EBC3.8}}This is for the 3.8 kernel. [[EBC Exercise 13 Pulse Width Modulation 3.2]] is for the 3.2 kernel. | ||
− | In a previous exercise ([[EBC Exercise | + | In a previous exercise ([[EBC Exercise 11 gpio Polling and Interrupts]]) you saw how to use the gpio to produce a square wave out using a C program and sysfs. I was able to get a 1.5kHz square wave out; however we can do much better using some built in hardware on the Beagle. |
− | In this exercise | + | In this exercise you will learn how to use the Beagle's pulse width modulation (pwm) hardware using the sysfs interface. |
− | == | + | == Pulse Width Modulation == |
− | The | + | (Note: The pwm interface seems to changing. Some of this may not apply in the future.) |
− | + | We have to run a couple of commands to make the PWM interface appear. Try | |
+ | bone$ '''SLOTS=/sys/devices/bone_capemgr.*/slots''' | ||
+ | bone$ '''echo am33xx_pwm > $SLOTS''' | ||
+ | bone$ '''echo bone_pwm_P9_21 > $SLOTS''' | ||
+ | bone$ '''cd /sys/devices/ocp.2/pwm_test_P9_21.14''' | ||
+ | bone$ '''ls''' | ||
+ | driver duty modalias period polarity power run subsystem uevent | ||
− | + | The units are in ns. | |
+ | Try a 1Hz frequency with a 25% duty cycle | ||
+ | bone$ '''echo 1000000000 > period''' | ||
+ | bone$ '''echo 250000000 > duty''' | ||
+ | bone$ '''echo 1 > run''' | ||
− | + | Connect the LED from and watch it flash. Try changing the frequency and duty cycle. You may have to set the duty cycle to 0 to change the frequency. Can you guess why? | |
− | + | === Challenge === | |
+ | Combine the analog in and the PWM by having the pot control the frequency or the duty cycle of the LED. | ||
− | + | If you have an oscilloscope try probing pin P9_21. I'm getting a nice clean 1Hz signal, with no variation. Let's try a higher frequency, like 10 MHz. | |
+ | beagle$ '''echo 50 > duty_ns''' | ||
+ | beagle$ '''echo 100 > period_ns''' | ||
+ | I'm getting a 9 MHz signal that has lots of ringing. The timer in the bone must be off a bit. | ||
− | + | The [http://processors.wiki.ti.com/index.php/AM335x_PWM_Driver's_Guide AM335x PWM Driver's Guide] details what eCAP and eHRPWM are and gives some examples. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | {{YoderFoot}} | |
− | |||
− | |||
− | |||
− |
Latest revision as of 15:59, 19 September 2013
Embedded Linux Class by Mark A. Yoder
This is for the 3.8 kernel. EBC Exercise 13 Pulse Width Modulation 3.2 is for the 3.2 kernel.
In a previous exercise (EBC Exercise 11 gpio Polling and Interrupts) you saw how to use the gpio to produce a square wave out using a C program and sysfs. I was able to get a 1.5kHz square wave out; however we can do much better using some built in hardware on the Beagle.
In this exercise you will learn how to use the Beagle's pulse width modulation (pwm) hardware using the sysfs interface.
Pulse Width Modulation
(Note: The pwm interface seems to changing. Some of this may not apply in the future.)
We have to run a couple of commands to make the PWM interface appear. Try
bone$ SLOTS=/sys/devices/bone_capemgr.*/slots bone$ echo am33xx_pwm > $SLOTS bone$ echo bone_pwm_P9_21 > $SLOTS bone$ cd /sys/devices/ocp.2/pwm_test_P9_21.14 bone$ ls driver duty modalias period polarity power run subsystem uevent
The units are in ns. Try a 1Hz frequency with a 25% duty cycle
bone$ echo 1000000000 > period bone$ echo 250000000 > duty bone$ echo 1 > run
Connect the LED from and watch it flash. Try changing the frequency and duty cycle. You may have to set the duty cycle to 0 to change the frequency. Can you guess why?
Challenge
Combine the analog in and the PWM by having the pot control the frequency or the duty cycle of the LED.
If you have an oscilloscope try probing pin P9_21. I'm getting a nice clean 1Hz signal, with no variation. Let's try a higher frequency, like 10 MHz.
beagle$ echo 50 > duty_ns beagle$ echo 100 > period_ns
I'm getting a 9 MHz signal that has lots of ringing. The timer in the bone must be off a bit.
The AM335x PWM Driver's Guide details what eCAP and eHRPWM are and gives some examples.
Embedded Linux Class by Mark A. Yoder