Difference between revisions of "EBC Exercise 13 Pulse Width Modulation"
m (Added Analytics) |
m |
||
(34 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. |
− | + | == PWM on the Bone == | |
− | The | + | (Note: The pwm interface seems to changing. Some of this may not apply in the future.) |
− | + | The Bone has a PWM interface at <code>/sys/class/pwm/</code>. You can see what's there by: | |
− | + | beagle$ '''cd /sys/class/pwm''' | |
+ | beagle$ '''ls -F''' | ||
+ | export unexport | ||
+ | Hmmm, there isn't much there. We have to run a command to make something appear. Try | ||
+ | beagle$ '''SLOTS=/sys/devices/bone_capemgr.*/slots''' | ||
+ | beagle$ '''PINS=/sys/kernel/debug/pinctrl/44e10800.pinmux/pins''' | ||
+ | beagle$ '''echo am33xx_pwm > $SLOTS''' | ||
+ | beagle$ '''ls -F''' | ||
+ | export pwmchip0@ pwmchip2@ pwmchip3@ pwmchip5@ pwmchip7@ unexport | ||
+ | Now we need to run another command to say which pwm pin we want to use. I'm using P9_21. | ||
+ | beagle$ '''echo bone_pwm_P9_21 > $SLOTS | ||
+ | Now you can export a pwm much list you export a gpio port | ||
+ | beagle$ '''echo 1 > export''' | ||
+ | beagle$ '''cd pwm1''' | ||
+ | beagle$ '''ls -F''' | ||
+ | device@ duty_ns period_ns polarity power/ run subsystem@ uevent | ||
+ | Try a 1kHz frequency with a 25% duty cycle | ||
+ | beagle$ '''echo 1000000 > period_ns''' | ||
+ | beagle$ '''echo 250000 > duty_ns''' | ||
+ | beagle$ '''echo 1 > run''' | ||
+ | If you have an oscilloscope try probing pin P9_21. I'm getting a nice clean 1kHz 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. | |
− | + | 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? | |
− | + | Stick a scope on the pin and see if the frequency and duty cycle are right. What's the highest frequency you can get? What's the lowest? | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | {{YoderFoot}} | |
− | |||
− | |||
− | |||
− |
Revision as of 09:34, 31 May 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.
PWM on the Bone
(Note: The pwm interface seems to changing. Some of this may not apply in the future.)
The Bone has a PWM interface at /sys/class/pwm/
. You can see what's there by:
beagle$ cd /sys/class/pwm beagle$ ls -F export unexport
Hmmm, there isn't much there. We have to run a command to make something appear. Try
beagle$ SLOTS=/sys/devices/bone_capemgr.*/slots beagle$ PINS=/sys/kernel/debug/pinctrl/44e10800.pinmux/pins beagle$ echo am33xx_pwm > $SLOTS beagle$ ls -F export pwmchip0@ pwmchip2@ pwmchip3@ pwmchip5@ pwmchip7@ unexport
Now we need to run another command to say which pwm pin we want to use. I'm using P9_21.
beagle$ echo bone_pwm_P9_21 > $SLOTS
Now you can export a pwm much list you export a gpio port
beagle$ echo 1 > export beagle$ cd pwm1 beagle$ ls -F device@ duty_ns period_ns polarity power/ run subsystem@ uevent
Try a 1kHz frequency with a 25% duty cycle
beagle$ echo 1000000 > period_ns beagle$ echo 250000 > duty_ns beagle$ echo 1 > run
If you have an oscilloscope try probing pin P9_21. I'm getting a nice clean 1kHz 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.
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?
Stick a scope on the pin and see if the frequency and duty cycle are right. What's the highest frequency you can get? What's the lowest?
Embedded Linux Class by Mark A. Yoder