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

相关文章

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

Golang如何用gorm实现分页的功能

《Golang如何用gorm实现分页的功能》:本文主要介绍Golang如何用gorm实现分页的功能方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景go库下载初始化数据【1】建表【2】插入数据【3】查看数据4、代码示例【1】gorm结构体定义【2】分页结构体

Java Web实现类似Excel表格锁定功能实战教程

《JavaWeb实现类似Excel表格锁定功能实战教程》本文将详细介绍通过创建特定div元素并利用CSS布局和JavaScript事件监听来实现类似Excel的锁定行和列效果的方法,感兴趣的朋友跟随... 目录1. 模拟Excel表格锁定功能2. 创建3个div元素实现表格锁定2.1 div元素布局设计2.

HTML5实现的移动端购物车自动结算功能示例代码

《HTML5实现的移动端购物车自动结算功能示例代码》本文介绍HTML5实现移动端购物车自动结算,通过WebStorage、事件监听、DOM操作等技术,确保实时更新与数据同步,优化性能及无障碍性,提升用... 目录1. 移动端购物车自动结算概述2. 数据存储与状态保存机制2.1 浏览器端的数据存储方式2.1.

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置

苹果macOS 26 Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色

《苹果macOS26Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色》在整体系统设计方面,macOS26采用了全新的玻璃质感视觉风格,应用于Dock栏、应用图标以及桌面小部件等多个界面... 科技媒体 MACRumors 昨日(6 月 13 日)发布博文,报道称在 macOS 26 Tahoe 中

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

MybatisPlus service接口功能介绍

《MybatisPlusservice接口功能介绍》:本文主要介绍MybatisPlusservice接口功能介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录Service接口基本用法进阶用法总结:Lambda方法Service接口基本用法MyBATisP

华为鸿蒙HarmonyOS 5.1官宣7月开启升级! 首批支持名单公布

《华为鸿蒙HarmonyOS5.1官宣7月开启升级!首批支持名单公布》在刚刚结束的华为Pura80系列及全场景新品发布会上,除了众多新品的发布,还有一个消息也点燃了所有鸿蒙用户的期待,那就是Ha... 在今日的华为 Pura 80 系列及全场景新品发布会上,华为宣布鸿蒙 HarmonyOS 5.1 将于 7