6971|8

6105

帖子

4

TA的资源

版主

楼主
 

BeagleBone DIY 之继续继续 继电器的GPIO操作 [复制链接]

BeagleBone的GPIO方式控制继电器
继电器接口有:
DOUT1   GPIO1_6     
DOUT2   GPIO1_7     
DOUT3   GPIO1_2     
DOUT4   GPIO1_3     
DOUT5   GPIO1_13   
DOUT6   GPIO1_12   
DOUT7   EHRPWM2B ?     
DOUT8   GPIO0_26   
DOUT9   GPIO1_15   
DOUT10  GPIO1_14
GPIO8中工作模式,分别为MODE0-MODE7,不同的工作模式GPIO具有不同的功能。通常情况下,默认的工作模式为MODE7,但不是所有的GPIO都设置为MODE7
GPIOc操作需要二个步骤:
1.      选定具体GPIO口,设置GPIO口的工作模式;
2.编写控制程序。
GPIO的工作模式设定
任何一个GPIO口都可以。注意: GPIO的拉电流最大只有8mA。
BeagleBone的引脚工作模式设置:
/sys/kernel/debug/omap_mux文件下有每个引脚的模式设定文件。
输入:# ls /sys/kernel/debug/omap_mux就可以查看到。
由下表可知对应设置文件为gpmc_ad6。同理,GPIO1_7对应的文件为gpmc_ad7,TIMER4对应的文件为gprnc_advn_ale。
图表在BONE_SRM.pdf PAGE 55可以查到。


继电器1(DOUT1腿)对应   GPIO1_6
首先查看GPIO1_6引脚的工作模式,在中断输入:#
#cat  /sys/kernel/debug/omap_mux/gpmc_ad6回车后可以看到如下内容:
root@beaglebone:/# cat sys/kernel/debug/omap_mux/gpmc_ad6
name: gpmc_ad6.gpio1_6 (0x44e10818/0x818 = 0x0037), b NA, t NA
mode: OMAP_PIN_OUTPUT | OMAP_MUX_MODE7
signals: gpmc_ad6 | mmc1_dat6 | NA | NA | NA | NA | NA | gpio1_6
root@beaglebone:/#
由上可知GPIO1_6工作模式为OMAP_MUX_MODE0(MODE0),寄存器的数据为0x0000,而作为普通I/O口工作模式为MODE7,所以需要更改工作模式。MODE7。
有关GPIO的寄存器可以参考AM335X技术参考手册:spruh73f.dpf
在终端内输入:# echo 7 > /sys/kernel/debug/omap_mux/gpmc_ad6,即可通过管道设置GPIO1_6的寄存器值为0x0007,再次输入:#cat /sys/kernel/debug/omap_mux/gpmc_ad可以看到如下内容:
root@beaglebone:/# echo sys/kernel/debug/omap_mux/gpmc_ad6
sys/kernel/debug/omap_mux/gpmc_ad6
root@beaglebone:/# cat sys/kernel/debug/omap_mux/gpmc_ad6   
name: gpmc_ad6.gpio1_6 (0x44e10818/0x818 = 0x0037), b NA, t NA
mode: OMAP_PIN_OUTPUT | OMAP_MUX_MODE7
signals: gpmc_ad6 | mmc1_dat6 | NA | NA | NA | NA | NA | gpio1_6
root@beaglebone:/#可以看到工作模式已经更改为MODE7,至此就完成了GPIO的工作模式设置。



2. 编写控制程序
GPIO的配置文件在/sys/class/gpio
root@beaglebone:/# ls sys/class/gpio/
export  gpiochip0  gpiochip32  gpiochip64  gpiochip96  unexport
root@beaglebone:/#
控制程序:
1,配置GPIO:在/sys/class/gpio目录下可以看到文件export,调用该文件以实现配置。该文件对所有GPIO编号,从0开始。GPIOn_x的编号为32*n+x,例如此处用的GPIO1_6的编号为32*1+6=38。在终端输入:# echo "38" > /sys/class/gpio/export,
root@beaglebone:/# echo "38" > /sys/class/gpio/export
root@beaglebone:/# ls sys/class/gpio/                 
export  gpio38  gpiochip0  gpiochip32  gpiochip64  gpiochip96  unexport
root@beaglebone:/#
在此回到目录/sys/class/gpio下,可以看到产生了一个新的目录./gpio38,里面包含了该IO口的输入输出设置等配置文件。export文件只有root写权限,执行上述命令或者以后用C编写的可执行文件要以ROOT身份执行。
设置GPIO的方向(输入输出):
# echo "out" > /sys/class/gpio/gpio38/direction,即设置该GPIO为输出。
设置GPIO的输出电平:输入:
#echo "1" > /sys/class/gpio/gpio38/value,即设置GPIO输出高电平,输入echo "0" > /sys/class/gpio/gpio38/value设置GPIO输出低电平。
关闭GPIO:在终端输入:#echo "38" > /sys/class/gpio/unexport,即删除GPIO配置文件,可以看到目录gpio38已经被删除。


下面是C语言编写的GPIO控制例程,实现继电器1的每隔5秒动作一次。

#include
#include
#include
#include
int main(void)
{
FILE *p=NULL;
int i=0;
p = fopen("/sys/class/gpio/export","w");
fprintf(p,"%d",38);
fclose(p);
p = fopen("/sys/class/gpio/gpio38/direction","w");
fprintf(p,"out");
fclose(p);
for(i=0;i<1000;i++)
{
  p = fopen("/sys/class/gpio/gpio38/value","w");
  fprintf(p,"%d",1);
  sleep(5);
  fclose(p);
  p = fopen("/sys/class/gpio/gpio38/value","w");
  fprintf(p,"%d",0);
  sleep(5);
  fclose(p);
}
p = fopen("/sys/class/gpio/unexport","w");
fprintf(p,"%d",38);
fclose(p);
return 0;
}
回到前面:
继电器接口对应文件有:
DOUT1   GPIO1_6     gpmc_ad6
DOUT2   GPIO1_7     gpmc_ad7
DOUT3   GPIO1_2     gpmc_ad2
DOUT4   GPIO1_3     gpmc_ad3
DOUT5   GPIO1_13   gpmc_ad13
DOUT6   GPIO1_12   gpmc_ad12
DOUT7   EHRPWM2B gpmc_ad9     
DOUT8   GPIO0_26   gpmc_ad10
DOUT9   GPIO1_15   gpmc_ad15
DOUT10  GPIO1_14   gpmc_ad14
首先设置模式为GPIO  7
# echo 7 > sys/kernel/debug/omap_mux/gpmc_ad6
# echo 7 > sys/kernel/debug/omap_mux/gpmc_ad7
# echo 7 > sys/kernel/debug/omap_mux/gpmc_ad2
# echo 7 > sys/kernel/debug/omap_mux/gpmc_ad3
# echo 7 > sys/kernel/debug/omap_mux/gpmc_ad13
# echo 7 > sys/kernel/debug/omap_mux/gpmc_ad12
# echo 7 > sys/kernel/debug/omap_mux/gpmc_ad9
# echo 7 > sys/kernel/debug/omap_mux/gpmc_ad10
# echo 7 > sys/kernel/debug/omap_mux/gpmc_ad15
# echo 7 > sys/kernel/debug/omap_mux/gpmc_ad14

也可以运行程序:
#include
#include
#include
#include
int main(void)
{
FILE *p=NULL;
int i=0;
For(i =1;i < 11; i++;)
{
Switch(i)
{
Case 1:
              p = fopen("sys/kernel/debug/omap_mux/gpmc_ad6
","w");
              break;
Case 2:
              p = fopen("sys/kernel/debug/omap_mux/gpmc_ad7
","w");
              break;
Case 3:
              p = fopen("sys/kernel/debug/omap_mux/gpmc_ad2
","w");
              break;
Case 4:
                     p = fopen("sys/kernel/debug/omap_mux/gpmc_ad3","w");
                     break;
case 5:
p = fopen("sys/kernel/debug/omap_mux/gpmc_ad13","w");
       break;
              case 6:
                     p = fopen("sys/kernel/debug/omap_mux/gpmc_ad12","w");
                     break;
              case 7:
                     p = fopen("sys/kernel/debug/omap_mux/gpmc_ad9","w");
                     break;
              case 8:
                     p = fopen("sys/kernel/debug/omap_mux/gpmc_ad10","w");
                     break;
              case 9:
                     p = fopen("sys/kernel/debug/omap_mux/gpmc_ad15","w");
                     break;
              case 10:
                     p = fopen("sys/kernel/debug/omap_mux/gpmc_ad14","w");
                     break;
}
fprintf(p,"%d",7);
       fclose(p);
}
}

其次参数GPIO操作文件
其次编写相应程序:1,程序中产生相应文件去操作 也可以在程序外面产生。
                  2,操作GPIO对应文件
明天继续编写。
relay_gpioset.c (1.14 KB, 下载次数: 16)
relay_gpiofile.c (1.26 KB, 下载次数: 15)
relay_gpio_nooff.c (2.84 KB, 下载次数: 14)



[ 本帖最后由 damiaa 于 2012-10-24 00:00 编辑 ]

最新回复

赞一个~  详情 回复 发表于 2014-1-19 11:19
点赞 关注(1)
 

回复
举报

5979

帖子

8

TA的资源

版主

沙发
个人签名生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
 
 

回复

1173

帖子

3

TA的资源

五彩晶圆(初级)

板凳
 
 
 

回复

8

帖子

0

TA的资源

一粒金砂(初级)

4
 
太感谢了
 
 
 

回复

535

帖子

0

TA的资源

版主

5
 
如果能用GPIO控制继电器的通断,用声音形成音乐,那更好了
 
 
 

回复

54

帖子

1

TA的资源

一粒金砂(中级)

6
 
感谢分享
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

7
 
谢谢分享
 
 
 

回复

24

帖子

4

TA的资源

一粒金砂(初级)

8
 
我编译lz的程序运行后出现:Segmentation fault
 
 
 

回复

1560

帖子

24

TA的资源

五彩晶圆(初级)

9
 
赞一个~
个人签名这孩子,成熟的象征,理智的典范。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表