beaglebone php,Beaglebone Black开启PWM功能【酷】

2023-11-05 16:20

本文主要是介绍beaglebone php,Beaglebone Black开启PWM功能【酷】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

虽然本文讲的是开启PWM功能,但是其他模块的使用也是一样的,很有参考价值,百度搜不到,用必应bing才能更好的搜索外文,使用BBB好久了,才发现很多dts都有现成的,直接加载就好了(安装到slots槽中即可)。我是用最新的Debian系统,跟本文有点差异,但是本文很有参考价值。

另外备注:在将cape-universaln插入槽中(slots)后,在root@beaglebone:/sys/devices/platform/ocp/ocp:P9_14_pinmux中将P9_14设置为pwm模式(#config-pin

P9.14 pwm)后,需要在/sys/class/pwm/pwmchip2中echo 0 >

export,这里为什么是pwmchip2,因为pwmchip2的地址0x4830_2000对应的是PWM1,echo

0是开启EHRPWM1A,echo

1是开启EHRPWM1B。具体地址映射可参见AM335x参考手册memory

map部分。

a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png

EHRPWM0A

P9_22,

P9_31

EHRPWM0B

P9_21,

P9_29

EHRPWM1A

P9_14,

P8_36

EHRPWM1B

P9_16,

P8_34

EHRPWM2A

P8_19,

P8_45

EHRPWM2B

P8_13,

P8_46

周期1秒,频率1Hz,注意单位都是ns。这样就成功了。

root@beaglebone:/sys/class/pwm/pwmchip2# echo 0

> export

root@beaglebone:/sys/class/pwm/pwmchip2# cd

pwm0/

root@beaglebone:/sys/class/pwm/pwmchip2/pwm0#

echo 1000000000 > period

root@beaglebone:/sys/class/pwm/pwmchip2/pwm0#

echo 500000000 > duty_cycle

root@beaglebone:/sys/class/pwm/pwmchip2/pwm0#

echo 1 > enable

These notes are based on the

3.8.13-bone70 complete installation as described over

at

Contents

Selecting Overlays to

use

Having being reading

numerous pages about Device Tree Overlays I finally came up with a

couple of solutions for how to enable the AM355 pinmux and setting

the correct modes in order to enable PWM output.

If you just need one or a

few PWM outputs you can generate overlay files over

at

If you want to enable a

complete set of facilities on the BBB you can jump down to

the

A common

preparation

If you frequently access the

/sys/devices/bone_capemgr.9/slots file it is highly recommended

that yo prepare an environment variable

called SLOTS.

In you ~/.bashrc add these

lines

export

SLOTS=/sys/devices/bone_capemgr.9/slots

export

PINS=/sys/kernel/debug/pinctrl/44e10800.pinmux/pins

The former set the

environment variable SLOTS to point to the slots file and the

latter sets the PINS environment variable to point to the file that

lists the pins assigned in the pinmux.

In order to immediately gain

effect of the new setting issue

root@beaglebone$] .

~/.bashrc

which will read the .bashrc

file from the home directory and execute whatever in there in the

current shell. Don't try to execute the .bashrc file because the

changes will only be seen shortly in the new shell (bash) that

executes the script.

At every login hereafter

SLOTS is set to point the correct directory.

Single PWM

Setup

Over

at this

page you can generate a device overlay file

for each PWM channel you want to use.

Giving Input to the

Configurator

For example in order to

enable PWM on P9 pin 14. See the figure below how to setup the

configurator where the output is pulled up - you may want to selct

a pull down instead.

From the generator you will

get an output like this:

/dts-v1/;

/plugin/;

/

{

compatible = "ti,beaglebone",

"ti,beaglebone-black";

part-number =

"BS_PWM_P9_14_0x16";

exclusive-use

=

"P9.14",

"ehrpwm1A";

fragment@0 {

target = ;

__overlay__ {

bs_pwm_P9_14_0x16: pinmux_bs_pwm_P9_14_0x16 {

pinctrl-single,pins = <0x048 0x16>;

};

};

};

fragment@1 {

target = ;

__overlay__ {

bs_pwm_test_P9_14 {

compatible = "pwm_test";

pwms = ;

pwm-names =

"PWM_P9_14";

pinctrl-names =

"default";

pinctrl-0 = ;

enabled = <1>;

duty = <0>;

status = "okay";

};

};

};

};

Save this in a file name as

suggested: bspwm_P9_14_16-00A0.dts

If you want the polarity to

initially set to 0 change the 1 to 0 in the line pwms so it looks

like this

pwms = ;

Compile and

Test

Compile it using this

command:

root@begalebone $]

dtc -O dtb -o bspwm_P9_14_16-00A0.dtbo -b 0 -@

bspwm_P9_14_16-00A0.dts

Copy the .dtbo file to

/lib/firmware

As instructed on the

generator page you can enable this ovelay by issuing these

commands:

root@beaglebone $]

grep -q am33xx_pwm $SLOTS || echo am33xx_pwm >

$SLOTS

root@beaglebone $]

echo bspwm_P9_14_16 > $SLOTS

Check if this works and you

can see the PWM device by issuing

root@beaglebone:~$]

ll /sys/devices/ocp.3/bs_pwm_test_P9_14.15/

and get this

output

total

0

drwxr-xr-x 3 root

root 0 May 31

09:34 .

drwxr-xr-x 42 root

root 0

Mar 1 21:19 ..

lrwxrwxrwx 1 root

root 0 May 31

09:37 driver ->

../../../bus/platform/drivers/pwm_test

-rw------- 1 root root 4096

May 31 09:37 duty

-r--r--r-- 1 root root 4096

May 31 09:37 modalias

-rw------- 1 root root 4096

May 31 09:37 period

-rw------- 1 root root 4096

May 31 09:37 polarity

drwxr-xr-x 2 root

root 0 May 31

09:37 power

-rw------- 1 root root 4096

May 31 09:37 run

lrwxrwxrwx 1 root

root 0 May 31

09:34 subsystem -> ../../../bus/platform

-rw-r--r-- 1 root root 4096

May 31 09:34 uevent

Finally create an

ini-script that will perform the enabling every times the BBB

boots.

In /etc/init.d

create a file enable-pwm with

this content

#!

/bin/sh

### BEGIN INIT

INFO

# Provides:

enable-pwm

# Required-Start:

$all

# Required-Stop:

$all

# Default-Start: 2

3 4 5

# Default-Stop: 0 1

6

#

Short-Description: Enables the PWM chips and connects it through

the pinmux

# Description:

Conneting the pwm output through the pinmux and enables the PWM

chip on board

### END INIT

INFO

case "$1"

in

start)

echo "Enabling PWM on P9 Pin 14"

grep -q am33xx_pwm /sys/devices/bone_capemgr.9/slots || echo

"am33xx_pwm" >

/sys/devices/bone_capemgr.9/slots

echo bspwm_P9_14_16 >

/sys/devices/bone_capemgr.9/slots

;;

stop)

#no-op

;;

*)

#no-op

;;

esac

exit

0

After creating the

file execute

root@beaglebone $]

chmod 755 enable-pwm

root@beaglebone $]

update-rc.d enable-pwm defaults

The first command set the

file permissions and the second updates the init system to execute

the file at a correct time depending on the information given in

the first part of the script.

Complete

Setup

This section describes a

setup of the complete - almost - IO system on the

BBB.

Preparing

In

/opt/source/beaglebone-universal-io you'll find some general device

drivers for the BBB.

Since BBB uses the FDT

(Flattened Device Tree), where a general driver performs the most

of the work, no special driver is needed for PWM.

There are two steps in

enabling a device:

1. Setup the multiplexing of

the pins (i.e. connect the internal device to a pin accessible on

the outside)

2. Setup the peripheral (the

internal device such as PWM, GPIO, etc.) to the pin assigned

above

Ensure that your general

pinmux is setup for defaults by ensuring that

the /sys/devices/ocp.N (with N

currently showing 3) exists. If not then perform:

root@beaglebone$]

cd /opt/source/beaglebone-universal-io

root@beaglebone$]

echo cape-universaln >

/sys/devices/bone_capemgr.*/slots

expect an output

with this included:

drwxr-xr-x 3 root

root 0 May 24

09:24 P8_07_pinmux.15

drwxr-xr-x 3 root

root 0 May 24

09:24 P8_08_pinmux.16

drwxr-xr-x 3 root

root 0 May 24

09:24 P8_09_pinmux.17

drwxr-xr-x 3 root

root 0 May 24

09:24 P8_10_pinmux.18

drwxr-xr-x 3 root

root 0 May 24

09:24 P8_11_pinmux.19

drwxr-xr-x 3 root

root 0 May 24

09:24 P8_12_pinmux.20

drwxr-xr-x 3 root

root 0 May 24

09:24 P8_13_pinmux.21

drwxr-xr-x 3 root

root 0 May 24

09:24 P8_14_pinmux.22

drwxr-xr-x 3 root

root 0 May 24

09:24 P8_15_pinmux.23

drwxr-xr-x 3 root

root 0 May 24

09:24 P8_16_pinmux.24

drwxr-xr-x 3 root

root 0 May 24

09:24 P8_17_pinmux.25

drwxr-xr-x 3 root

root 0 May 24

09:24 P8_18_pinmux.26

drwxr-xr-x 3 root

root 0 May 24

09:24 P8_19_pinmux.27

drwxr-xr-x 3 root

root 0 May 24

09:24 P8_26_pinmux.28

drwxr-xr-x 3 root

root 0 May 24

09:24 P9_11_pinmux.29

drwxr-xr-x 3 root

root 0 May 24

09:24 P9_12_pinmux.30

drwxr-xr-x 3 root

root 0 May 24

09:24 P9_13_pinmux.31

drwxr-xr-x 3 root

root 0 May 24

09:24 P9_14_pinmux.32

drwxr-xr-x 3 root

root 0 May 24

09:24 P9_15_pinmux.33

drwxr-xr-x 3 root

root 0 May 24

09:24 P9_16_pinmux.34

drwxr-xr-x 3 root

root 0 May 24

09:24 P9_17_pinmux.35

drwxr-xr-x 3 root

root 0 May 24

09:24 P9_18_pinmux.36

drwxr-xr-x 3 root

root 0 May 24

09:24 P9_21_pinmux.37

drwxr-xr-x 3 root

root 0 May 24

09:24 P9_22_pinmux.38

drwxr-xr-x 3 root

root 0 May 24

09:24 P9_23_pinmux.39

drwxr-xr-x 3 root

root 0 May 24

09:24 P9_24_pinmux.40

drwxr-xr-x 3 root

root 0 May 24

09:24 P9_26_pinmux.41

drwxr-xr-x 3 root

root 0 May 24

09:24 P9_27_pinmux.42

drwxr-xr-x 3 root

root 0 May 24

09:24 P9_30_pinmux.43

drwxr-xr-x 3 root

root 0 May 24

09:24 P9_41_pinmux.44

drwxr-xr-x 3 root

root 0 May 24

09:24 P9_42_pinmux.46

drwxr-xr-x 3 root

root 0 May 24

09:24 P9_91_pinmux.45

drwxr-xr-x 3 root

root 0 May 24

09:24 P9_92_pinmux.47

Connecting pins to the PWM

Chip

Now in order to connect the

PWM to a pin look up what pin PWM can be output to in the

cape-universaln-00A0.dts file. You'll find that you can connect

them to for instance P9.14, P9.16, P9.21, and

P9.22.

To convince yourself on your

choice issue this command:

root@beagelbone$]

config-pin -l P9.14

expect this

output:

default gpio

gpio_pu gpio_pd pwm

Now in order to enable the

pwm to the P9.14 pin issue:

root@begalebone$]

config-pin P9.14 pwm

To ensure yourself that

you've got the PWM connected to the pin issue

root@beaglebone$]

cat /sys/devices/ocp.3/P9_14_pinmux.32/state

expect this

output

pwm

Locate the PWM control

files

Now where are the

PWM?

Issue

root@beaglebone$]

ll /sys/class/pwm/

and expect

this

total 0

drwxr-xr-x 2 root

root 0

Jan 1 2000 .

drwxr-xr-x 59 root

root 0

Jan 1 2000 ..

--w------- 1 root root 4096

Jan 1 2000

export

lrwxrwxrwx 1 root

root 0 May 24

09:30 pwmchip0 ->

../../devices/ocp.3/48300000.epwmss/48300200.ehrpwm/pwm/pwmchip0

lrwxrwxrwx 1 root

root 0 May 24

09:30 pwmchip2 ->

../../devices/ocp.3/48300000.epwmss/48300100.ecap/pwm/pwmchip2

lrwxrwxrwx 1 root

root 0 May 24

09:30 pwmchip3 ->

../../devices/ocp.3/48302000.epwmss/48302200.ehrpwm/pwm/pwmchip3

lrwxrwxrwx 1 root

root 0 May 24

09:30 pwmchip5 ->

../../devices/ocp.3/48304000.epwmss/48304200.ehrpwm/pwm/pwmchip5

lrwxrwxrwx 1 root

root 0 May 24

09:30 pwmchip7 ->

../../devices/ocp.3/48304000.epwmss/48304100.ecap/pwm/pwmchip7

--w------- 1 root root 4096

Jan 1 2000

unexport

How to interpret this

output. First we'll have to look into this technical

document over the AM335x Sitara Processors.

(If the document is not available search for AM335 Sitara Processor

Technical Reference Manual - it's a ~22 MB

document).

Looking for address 48300000

in the memory map, you'll find this is in the L4_PER block, and

this is listed as the “PWM subsystem 0″, and 48300200 is the EHR0

PWM channel and 48300100 the eCAP0 PWM. Also, address 4830200 is

the “PWM subsystem 1″, and address 4830400 is the “PWM subsystem

2″.

Now, using the pin names

found from the BeagleBoard.org –

bone101 page served from the board, and

deductive reasoning you'll come up with the following maping of pin

to export number:

export number

pin name

pins

0

EHRPWM0A

P9.22,P9.31

1

EHRPWM0B

P9.21,P9.29

2

ECAPPWM0

P9.42

3

EHRPWM1A

P9.14,P8.36

4

EHRPWM1B

P9.16,P8.34

5

EHRPWM2A

P8.19,P8.45

6

EHRPWM2B

P8.13,P8.46

7

ECAPPWM2

P9.28

Enable the pin for the

PWM

Now we're ready to enable a

pwm for instance P9_14. This is done by looking up P9.14 in the

table above and see that it is export number 3. So

perform

root@beaglebone$]

echo 3 > /sys/class/pwm/export

NOTE here there needs to be

a space between 3 and >!

root@beaglebone$]

ls /sys/class/pwm/

will give you

this

export pwm3 pwmchip0 pwmchip2 pwmchip3 pwmchip5 pwmchip7 unexport

No issuing

root@begalebone$]

ll /sys/class/pwm/pwm3/

will

output

total 0

drwxr-xr-x 3 root

root 0 May 24

09:52 .

drwxr-xr-x 4 root

root 0 May 24

09:24 ..

lrwxrwxrwx 1 root

root 0 May 24

09:57 device -> ../../../48302200.ehrpwm

-rw-r--r-- 1 root

root 4096 May 24 09:57 duty_ns

-rw-r--r-- 1 root

root 4096 May 24 09:57 period_ns

-rw-r--r-- 1 root

root 4096 May 24 09:57 polarity

drwxr-xr-x 2 root

root 0 May 24

09:57 power

-rw-r--r-- 1 root

root 4096 May 24 09:57 run

lrwxrwxrwx 1 root

root 0 May 24

09:52 subsystem -> ../../../../../../class/pwm

-rw-r--r-- 1 root

root 4096 May 24 09:52 uevent

The files of interest here

are

the duty_ns, period_ns and polarity.

The polarity sets

the polarity of the output signal. Typically setup once at

initialisation.

The period_ns sets

the period time active for the PWM signal. In nano seconds.

Typically setup once at initialisation.

The duty_ns sets

the duty cycle for the PWM signal - i.e. the length of the period

time the PWM signal is active. In nano seconds. This one is

constantly updated with the desired duty cycle.

Control the

PWM

No you can control the PWM

from the command line or you can write a C/C++ program that will

open, write and close the above mentioned files in order to control

the PWM.

Set the Pinmux and Enable at

boot

If you want to enable the

PWM in a quick way create a script in /etc/init.d

called enable-pwm and put in this

text into the file

#! /bin/sh

### BEGIN INIT

INFO

# Provides:

enable-pwm

# Required-Start:

$all

# Required-Stop:

$all

# Default-Start: 2

3 4 5

# Default-Stop: 0 1

6

#

Short-Description: Enables the PWM chips and connects it through

the pinmux

# Description:

Connecting the pwm output through the pinmux and enables the PWM

chip on board

### END INIT

INFO

case “$1″

in

start)

# Add the BeagleBone overlay to the default setup

echo cape-universaln >

/sys/devices/bone_capemgr.9/slots

# Connect the P9.14 to the PWM

config-pin P9.14 pwm

# Now we are ready to enable the PWM chip

echo 3 > /sys/class/pwm/export

;;

stop)

#no-op

;;

*)

#no-op

;;

esac

exit

0

The first part after the

#!/bin/sh tells the systemd information about your

service.

Next comes the actual code

part, where the case switches on the first parameter to the script.

It can

be start or stop.

The start command will be handled in the

section start). Likewise goes for the stop

command.

In order to insert this as a

service in the systemd execute these

instructions:

root@beaglebone$]

chmod +x

enable-pwm ##

Give execute rights to the script

root@beaglebone$]

insserv -n enable-pwm ## Checks the

script

root@beaglebone$]

insserv

enable-pwm ## Actually inserts the script

Now reboot the system and

check if your PWM has be enables and routed to

P9_14.

Removing an entry from

slots

In the previous sections

echo'ing a value into /sys/devices/bone_capemgr.9/slots (typically

refered to as $SLOTS) enabled the device overlay. If the overlay

should be removed without rebooting then issue this

command

root@beaglebone$] cat

$SLOTS

This is a typical

output

0:

54:PF---

1:

55:PF---

2:

56:PF---

3:

57:PF---

4: ff:P-O-L

Bone-LT-eMMC-2G,00A0,Texas

Instrument,BB-BONE-EMMC-2G

5: ff:P-O-L

Bone-Black-HDMI,00A0,Texas

Instrument,BB-BONELT-HDMI

7: ff:P-O-L

Override Board Name,00A0,Override Manuf,DS1820

8: ff:P-O-L

Override Board Name,00A0,Override

Manuf,am33xx_pwm

9: ff:P-O-L

Override Board Name,00A0,Override

Manuf,bspwm_P9_14_16

If the bspwm_P9_14_16 is to

be removed issue

root@beaglebone$]

echo -9 > $SLOTS

root@beaglebone$]

cat $SLOTS

with this

result

0:

54:PF---

1:

55:PF---

2:

56:PF---

3:

57:PF---

4: ff:P-O-L

Bone-LT-eMMC-2G,00A0,Texas

Instrument,BB-BONE-EMMC-2G

5: ff:P-O-L

Bone-Black-HDMI,00A0,Texas

Instrument,BB-BONELT-HDMI

7: ff:P-O-L

Override Board Name,00A0,Override Manuf,DS1820

8: ff:P-O-L

Override Board Name,00A0,Override

Manuf,am33xx_pwm

这篇关于beaglebone php,Beaglebone Black开启PWM功能【酷】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/351035

相关文章

Android 实现一个隐私弹窗功能

《Android实现一个隐私弹窗功能》:本文主要介绍Android实现一个隐私弹窗功能,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 效果图如下:1. 设置同意、退出、点击用户协议、点击隐私协议的函数参数2. 《用户协议》、《隐私政策》设置成可点击的,且颜色要区分出来res/l

Android实现一键录屏功能(附源码)

《Android实现一键录屏功能(附源码)》在Android5.0及以上版本,系统提供了MediaProjectionAPI,允许应用在用户授权下录制屏幕内容并输出到视频文件,所以本文将基于此实现一个... 目录一、项目介绍二、相关技术与原理三、系统权限与用户授权四、项目架构与流程五、环境配置与依赖六、完整

使用Python创建一个功能完整的Windows风格计算器程序

《使用Python创建一个功能完整的Windows风格计算器程序》:本文主要介绍如何使用Python和Tkinter创建一个功能完整的Windows风格计算器程序,包括基本运算、高级科学计算(如三... 目录python实现Windows系统计算器程序(含高级功能)1. 使用Tkinter实现基础计算器2.

Android使用ImageView.ScaleType实现图片的缩放与裁剪功能

《Android使用ImageView.ScaleType实现图片的缩放与裁剪功能》ImageView是最常用的控件之一,它用于展示各种类型的图片,为了能够根据需求调整图片的显示效果,Android提... 目录什么是 ImageView.ScaleType?FIT_XYFIT_STARTFIT_CENTE

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

springboot项目如何开启https服务

《springboot项目如何开启https服务》:本文主要介绍springboot项目如何开启https服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录springboot项目开启https服务1. 生成SSL证书密钥库使用keytool生成自签名证书将

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络

Redis消息队列实现异步秒杀功能

《Redis消息队列实现异步秒杀功能》在高并发场景下,为了提高秒杀业务的性能,可将部分工作交给Redis处理,并通过异步方式执行,Redis提供了多种数据结构来实现消息队列,总结三种,本文详细介绍Re... 目录1 Redis消息队列1.1 List 结构1.2 Pub/Sub 模式1.3 Stream 结

MySQL索引的优化之LIKE模糊查询功能实现

《MySQL索引的优化之LIKE模糊查询功能实现》:本文主要介绍MySQL索引的优化之LIKE模糊查询功能实现,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前缀匹配优化二、后缀匹配优化三、中间匹配优化四、覆盖索引优化五、减少查询范围六、避免通配符开头七、使用外部搜索引擎八、分

Android实现悬浮按钮功能

《Android实现悬浮按钮功能》在很多场景中,我们希望在应用或系统任意界面上都能看到一个小的“悬浮按钮”(FloatingButton),用来快速启动工具、展示未读信息或快捷操作,所以本文给大家介绍... 目录一、项目概述二、相关技术知识三、实现思路四、整合代码4.1 Java 代码(MainActivi