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

相关文章

springboot+redis实现订单过期(超时取消)功能的方法详解

《springboot+redis实现订单过期(超时取消)功能的方法详解》在SpringBoot中使用Redis实现订单过期(超时取消)功能,有多种成熟方案,本文为大家整理了几个详细方法,文中的示例代... 目录一、Redis键过期回调方案(推荐)1. 配置Redis监听器2. 监听键过期事件3. Redi

Qt实现对Word网页的读取功能

《Qt实现对Word网页的读取功能》文章介绍了几种在Qt中实现Word文档(.docx/.doc)读写功能的方法,包括基于QAxObject的COM接口调用、DOCX模板替换及跨平台解决方案,重点讨论... 目录1. 核心实现方式2. 基于QAxObject的COM接口调用(Windows专用)2.1 环境

SpringBoot+Vue3整合SSE实现实时消息推送功能

《SpringBoot+Vue3整合SSE实现实时消息推送功能》在日常开发中,我们经常需要实现实时消息推送的功能,这篇文章将基于SpringBoot和Vue3来简单实现一个入门级的例子,下面小编就和大... 目录前言先大概介绍下SSE后端实现(SpringBoot)前端实现(vue3)1. 数据类型定义2.

SpringBoot整合Apache Spark实现一个简单的数据分析功能

《SpringBoot整合ApacheSpark实现一个简单的数据分析功能》ApacheSpark是一个开源的大数据处理框架,它提供了丰富的功能和API,用于分布式数据处理、数据分析和机器学习等任务... 目录第一步、添加android依赖第二步、编写配置类第三步、编写控制类启动项目并测试总结ApacheS

Python实现繁体转简体功能的三种方案

《Python实现繁体转简体功能的三种方案》在中文信息处理中,繁体字与简体字的转换是一个常见需求,无论是处理港澳台地区的文本数据,还是开发面向不同中文用户群体的应用,繁简转换都是不可或缺的功能,本文将... 目录前言为什么需要繁简转换?python实现方案方案一:使用opencc库方案二:使用zhconv库

Qt实现删除布局与布局切换功能

《Qt实现删除布局与布局切换功能》在Qt应用开发中,动态管理布局是一个常见需求,比如根据用户操作动态删除某个布局,或在不同布局间进行切换,本文将详细介绍如何实现这些功能,并通过完整示例展示具体操作,需... 目录一、Qt动态删除布局1. 布局删除的注意事项2. 动态删除布局的实现步骤示例:删除vboxLay

Spring Boot整合Redis注解实现增删改查功能(Redis注解使用)

《SpringBoot整合Redis注解实现增删改查功能(Redis注解使用)》文章介绍了如何使用SpringBoot整合Redis注解实现增删改查功能,包括配置、实体类、Repository、Se... 目录配置Redis连接定义实体类创建Repository接口增删改查操作示例插入数据查询数据删除数据更

使用EasyPoi快速导出Word文档功能的实现步骤

《使用EasyPoi快速导出Word文档功能的实现步骤》EasyPoi是一个基于ApachePOI的开源Java工具库,旨在简化Excel和Word文档的操作,本文将详细介绍如何使用EasyPoi快速... 目录一、准备工作1、引入依赖二、准备好一个word模版文件三、编写导出方法的工具类四、在Export

Java服务实现开启Debug远程调试

《Java服务实现开启Debug远程调试》文章介绍如何通过JVM参数开启Java服务远程调试,便于在线上排查问题,在IDEA中配置客户端连接,实现无需频繁部署的调试,提升效率... 目录一、背景二、相关图示说明三、具体操作步骤1、服务端配置2、客户端配置总结一、背景日常项目中,通常我们的代码都是部署到远程

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②