在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux應(yīng)用開發(fā)【第十一章】PWM編程應(yīng)用開發(fā)

weidongshan ? 來源:weidongshan ? 作者:weidongshan ? 2021-12-10 19:25 ? 次閱讀

文章目錄

11 PWM編程應(yīng)用開發(fā)

11.1 PWM概述

11.1.1 PWM的參數(shù)說明

11.2 用戶層查看PWM

11.3 PWM的SYSFS使用

11.4 PWM應(yīng)用編程

11.4.1 修改設(shè)備樹

11.4.2 修改配置文件

11.4.3 添加驅(qū)動(dòng)

11.4.4 運(yùn)行測(cè)試

11 PWM編程應(yīng)用開發(fā)

11.1 PWM概述

? PWM,英文名Pulse Width Modulation,是脈沖寬度調(diào)制縮寫,它是通過對(duì)一系列脈沖的寬度進(jìn)行調(diào)制,等效出所需要的波形(包含形狀以及幅值),對(duì)模擬信號(hào)電平進(jìn)行數(shù)字編碼,也就是說通過調(diào)節(jié)占空比的變化來調(diào)節(jié)信號(hào)、能量等的變化,占空比就是指在一個(gè)周期內(nèi),信號(hào)處于高電平的時(shí)間占據(jù)整個(gè)信號(hào)周期的百分比,例如方波的占空比就是50%。是利用微處理器的數(shù)字輸出來對(duì)模擬電路進(jìn)行控制的一種非常有效的技術(shù)。

poYBAGGzOTeAMvdqAAAzet9xcHI318.png

? PWM信號(hào)把模擬信號(hào)轉(zhuǎn)化為數(shù)字電路所需要的編碼,現(xiàn)在基本是采用數(shù)字電路,因此在很多場(chǎng)合都采用PWM信號(hào),我們經(jīng)常見到的就是交流調(diào)光電路,也可以說是無級(jí)調(diào)速,高電平占多一點(diǎn),也就是占空比大一點(diǎn)亮度就亮一點(diǎn),占空比小一點(diǎn)亮度就沒有那么亮,前提是PWM的頻率要大于我們?nèi)搜圩R(shí)別頻率,要不然會(huì)出現(xiàn)閃爍現(xiàn)象。除了在調(diào)光電路應(yīng)用,還有在直流斬波電路、蜂鳴器驅(qū)動(dòng)、電機(jī)驅(qū)動(dòng)、逆變電路、加濕機(jī)霧化量等都會(huì)有應(yīng)用。

pYYBAGGzOT6ADz5WAAAajfUkDIQ538.png

11.1.1 PWM的參數(shù)說明

https://www.kernel.org/doc/Documentation/pwm.txt
period
PWM信號(hào)的總周期(讀/寫)。
值以納秒為單位,是活動(dòng)和非活動(dòng)的總和
PWM的時(shí)間。

duty_cycle(占空比)
PWM信號(hào)的有效時(shí)間(讀/寫)。
值以納秒為單位,且必須小于周期。
在NORMAL模式下,表示一個(gè)周期內(nèi)高電平持續(xù)的時(shí)間
在INVERTED模式下,表示一個(gè)周期中低電平持續(xù)的時(shí)間

polarity
改變PWM信號(hào)的極性(讀/寫)。
寫入此屬性僅在PWM芯片支持更改時(shí)才有效
極性。只有PWM不能改變極性
啟用。值是字符串“normal”或“inversed”。

enable
啟用/禁用PWM信號(hào)(讀/寫)。

0 - 禁用

1 - 啟用

11.2 用戶層查看PWM

? 如果在內(nèi)核配置中啟用了CONFIG_SYSFS,則會(huì)提供一個(gè)簡(jiǎn)單的sysfs接口來使用用戶空間的PWM。它在/ sys / class / pwm /中公開。每個(gè)被探測(cè)的PWM控制器/芯片將被輸出為pwmchipN,其中N是PWM芯片的基礎(chǔ)。你在目錄里面會(huì)發(fā)現(xiàn):

 1 echo 0 > /sys/class/pwm/pwmchip0/export /*設(shè)置PWM4輸出,調(diào)出pwm0目錄下設(shè)備節(jié)點(diǎn),用于以下配置 */
 2 echo 1000000 >/sys/class/pwm/pwmchip0/pwm0/period /*設(shè)置PWM4一個(gè)周期的持續(xù)時(shí)間,單位為ns,即1K Hz */
 3 echo 500000 >/sys/class/pwm/pwmchip0/pwm0/duty_cycle /*設(shè)置一個(gè)周期中的”O(jiān)N”時(shí)間,單位為ns,即占空比=duty_cycle/period=50% */
 4 echo 1 >/sys/class/pwm/pwmchip0/pwm0/enable /*設(shè)置PWM4使能 */

11.3 PWM的SYSFS使用

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define dbmsg(fmt, args ...) printf("%s[%d]: "fmt"n", __FUNCTION__, __LINE__,##args)

#define DUTY              "duty"
#define PERIOD            "1000000"
#define DUTYCYCLE         "500000"
#define LENGTH            100

int fd_period = 0,fd_duty = 0,fd_enable = 0,duty_m = 0;

int usage()
{
    printf("usage:n");
    printf("./pwm-sysfs-test duty <0/1> : 0-->static; 1-->dynamic n");   
    return 0;
}

int pwm_setup()
{
  int fd,ret;

  fd = open("/sys/class/pwm/pwmchip0/export", O_WRONLY);
  if(fd < 0)
  {
      dbmsg("open export errorn");
      return -1;
  }
  ret = write(fd, "0", strlen("0"));
  if(ret < 0)
  {
      dbmsg("creat pwm0 errorn");
      return -1;
  }else
  dbmsg("export pwm0 okn");

  fd_period = open("/sys/class/pwm/pwmchip0/pwm0/period", O_RDWR);
  fd_duty = open("/sys/class/pwm/pwmchip0/pwm0/duty_cycle", O_RDWR);
  fd_enable = open("/sys/class/pwm/pwmchip0/pwm0/enable", O_RDWR);
  
  if((fd_period < 0)||(fd_duty < 0)||(fd_enable < 0))
  {
      dbmsg("open errorn");
      return -1;
  }

  ret = write(fd_period, PERIOD,strlen(PERIOD));
  if(ret < 0)
  {
      dbmsg("change period errorn");
      return -1;
  }else
    dbmsg("change period okn");

  ret = write(fd_duty, DUTYCYCLE, strlen(DUTYCYCLE));
  if(ret < 0)
  {
      dbmsg("change duty_cycle errorn");
      return -1;
  }else
    dbmsg("change duty_cycle okn");

  ret = write(fd_enable, "1", strlen("1"));
  if(ret < 0)
  {
      dbmsg("enable pwm0 errorn");
      return -1;
  }else
  dbmsg("enable pwm0 okn");

  duty_m = atoi(DUTYCYCLE)/2;
  printf("duty_m: %d n",duty_m);

  return 0;
}

int main ( int argc, char *argv[] )
{
  int ret;
  int num;
  if(argc < 2)
  {
    usage();
    return -1;
  }

  if(strncmp(argv[1],DUTY, sizeof(DUTY)) == 0)
  {
    dbmsg("%s", DUTY);
    if(argc != 3)
    {
      usage();
      return -1;
    }
    pwm_setup();
  }

  return 0;
}

11.4 PWM應(yīng)用編程

The main useful user API are the following:
devm_pwm_get() or pwm_get() / pwm_put(): this API is used to look up, request, then free a PWM device.
pwm_init_state(),pwm_get_state(), pwm_apply_state(): this API is used to initialize, retrieve and apply the current PWM device state.
pwm_config(): this API updates the PWM device configuration (period and duty cycle).

11.4.1 修改設(shè)備樹

beeper {
compatible = "pwm-beeper";
pwms = <&pwm 0 1000000 0>;
pinctrl-names = "default";
pinctrl-0 = <&pwm0_pin>;
};

11.4.2 修改配置文件

Activate PWM framework in the kernel configuration through the Linux menuconfig tool, Menuconfig or how to configure kernel (CONFIG_PWM=y):
Device Drivers  --->
   [*] Pulse-Width Modulation (PWM) Support  --->

11.4.3 添加驅(qū)動(dòng)

#include 
#include 
#include 
#include 
#include 
#include 

//#include 

#define PWM_ON  0x100001
#define PWM_OFF 0x100002

struct pwm_device *pwm_dev_2;
struct pwm_device *pwm_dev_3;

static long pwm_ioctl(struct file *file,
                        unsigned int cmd,
                        unsigned long arg)
{
    int ret;
    switch(cmd) {
        case PWM_ON:
                ret = pwm_config(pwm_dev_2,200000,500000);
                if(ret < 0){
                    printk("pwm_dev_2 ioctl fail");
                    return 0;
                }
                ret = pwm_config(pwm_dev_3,300000,500000);
                if(ret < 0){
                    printk("pwm_dev_3 ioctl fail");
                }
                pwm_enable(pwm_dev_2);
                pwm_enable(pwm_dev_3);
            break;
        case PWM_OFF:
                ret = pwm_config(pwm_dev_2,0,500000);
                if(ret < 0){
                    printk("pwm_dev_2 ioctl fail");
                    return 0;
                }
                ret = pwm_config(pwm_dev_3,0,500000);
                if(ret < 0){
                    printk("pwm_dev_3 ioctl fail");
                }
                pwm_disable(pwm_dev_2);
                pwm_disable(pwm_dev_3);
            break;
    }
    return 0;
}

//定義初始化硬件操作方法
static struct file_operations pwm_fops = {
    .owner = THIS_MODULE,
    .unlocked_ioctl = pwm_ioctl
};

//定義初始化混雜設(shè)備對(duì)象
static struct miscdevice pwm_misc = {
    .minor = MISC_DYNAMIC_MINOR, //動(dòng)態(tài)分配次設(shè)備號(hào)
    .name = "mypwm",             //dev/mypwm
    .fops = &pwm_fops 
};

static int pwm_init(void)
{
    int ret;
    printk("regisger pwm_misc devicen");
    //1.申請(qǐng)pwm資源,設(shè)置輸出為0
    pwm_dev_2 = pwm_request(1,"pwm_2");
    if(pwm_dev_2 == NULL){
        printk("pwm_dev_2 register failn");
    }
    pwm_dev_3 = pwm_request(2,"pwm_3");
    if(pwm_dev_3 == NULL){
        printk("pwn_dev_3 register failn");
    }

    ret = pwm_config(pwm_dev_2,0,500000);
    if(ret < 0){
        printk("pwm_config_2 init failn");
        return 0;
    }
    ret = pwm_config(pwm_dev_3,0,500000);
    if(ret < 0){
        printk("pwm_config_3 init failn");
        return 0;
    }

    ret = pwm_enable(pwm_dev_2);
    if(ret == 0){
        printk("pwm_enable_dev_2 init successn");
    }
    if(ret < 0 ){
        printk("pwm_enable_dev_2 init failn");
        return 0;
    }
    ret = pwm_enable(pwm_dev_3);
    if(ret == 0){
        printk("pwm_enable_dev_3 init successn");
    }
    if(ret < 0 ){
        printk("pwm_enable_dev_3 init failn");
        return 0;
    }
    //2.注冊(cè)混雜設(shè)備
    misc_register(&pwm_misc);
    return 0;
}

static void pwm_exit(void)
{
    printk("unregister pwm_misc devicen");
    //1.卸載混雜設(shè)備
    misc_deregister(&pwm_misc);
    //2.釋放pwm資源
    pwm_config(pwm_dev_2,0,500000);
    pwm_disable(pwm_dev_2);
    pwm_free(pwm_dev_2);
    
    pwm_config(pwm_dev_3,0,500000);
    pwm_disable(pwm_dev_3);
    pwm_free(pwm_dev_3);
}
module_init(pwm_init);
module_exit(pwm_exit);
MODULE_LICENSE("GPL");

11.4.4 運(yùn)行測(cè)試

#include  
#include  
#include  
#include  
 
#define PWM_ON  0x100001 
#define PWM_OFF 0x100002 
 
int main(void) 
{
    int fd; 
    int a; 
 
    fd = open("/dev/mypwm", O_RDWR); 
    if (fd < 0) 
        return -1; 
 
    while(1) { 
            ioctl(fd, PWM_ON); 
    } 
    close(fd); 
    return 0; 
}

審核編輯 黃昊宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • PWM
    PWM
    +關(guān)注

    關(guān)注

    114

    文章

    5205

    瀏覽量

    215254
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11357

    瀏覽量

    210820
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    明德?lián)P視頻分享點(diǎn)撥FPGA課程--第十一章 ?Signaltapll的使用技巧

    第十一章Signaltapll的使用技巧1. signaltapll使用http://yunpan.cn/cjZTiDA9pY56x訪問密碼 c359
    發(fā)表于 11-11 09:03

    至芯科技之a(chǎn)ltera 系列FPGA教程 第十一篇 添加激勵(lì)

    至芯科技之a(chǎn)ltera 系列FPGA教程 第十一篇 添加激勵(lì)
    發(fā)表于 08-11 03:29

    視頻詳解:上海尤老師verilog入門到實(shí)戰(zhàn)第十一

    上海尤老師verilog入門到實(shí)戰(zhàn)第十一課——手把手講解異步FIFO內(nèi)部原理2; 百度云網(wǎng)盤鏈接后綴:/s/1o8tV3PC, 加群討論252520964,307510678
    發(fā)表于 10-06 15:23

    第十一期 存儲(chǔ)與讀取文件

    第十一期實(shí)現(xiàn)寫入文件與文件的讀取操作
    發(fā)表于 09-16 12:23

    「正點(diǎn)原子Linux連載」第十一章模仿STM32驅(qū)動(dòng)開發(fā)格式實(shí)驗(yàn)

    ,獲取更多資料:正點(diǎn)原子第十一章模仿STM32驅(qū)動(dòng)開發(fā)格式實(shí)驗(yàn) 在上一章使用C語言編寫LED燈驅(qū)動(dòng)的時(shí)候,每個(gè)寄存器的地址我們都需要寫宏定義,使用起來非常的不方便。我們?cè)趯W(xué)習(xí)STM32的時(shí)候,可以
    發(fā)表于 12-20 15:03

    藍(lán)橋杯第十一屆省賽單片機(jī)組

    藍(lán)橋杯第十一屆省賽單片機(jī)組,翻了下以前做過的一些項(xiàng)目和比賽,發(fā)現(xiàn)了之前準(zhǔn)備比賽的一些注意事項(xiàng)和心得,分享給大家希望大家能夠避免錯(cuò)誤拿高分。 適當(dāng)?shù)难訒r(shí)很重要,可以解決一些不正常現(xiàn)象ds1302讀取
    發(fā)表于 07-14 06:57

    迅為iMX6ULL開發(fā)板使用手冊(cè)資料下載

    實(shí)驗(yàn)第四章 C語言實(shí)現(xiàn)LED例程第五章 移植官方SDK第六章 創(chuàng)建裸機(jī)工程第七章 蜂鳴器例程第八章 按鍵例程第九章 主頻和時(shí)鐘配置例程第十章 GPIO中斷例程第十一章 EPIT定時(shí)器例程第十二章 定時(shí)器
    發(fā)表于 12-02 14:13

    【傾心力作!】i.MX8MM嵌入式linux開發(fā)指南+全覆蓋開發(fā)資料

    搭建第四部分 開發(fā)板固件編譯第八章 Android編譯環(huán)境搭建第九章 Android固件編譯第十Linux固件編譯第十一章IMX8MM軟件資源介紹第五部分
    發(fā)表于 02-11 10:27

    更新 | 持續(xù)開源 迅為RK3568驅(qū)動(dòng)指南第十一篇-pinctrl子系統(tǒng)

    《iTOP-RK3568開發(fā)板驅(qū)動(dòng)開發(fā)指南》更新,本次更新內(nèi)容對(duì)應(yīng)的是驅(qū)動(dòng)(第十一期_pinctrl子系統(tǒng)-全新升級(jí))視頻,后續(xù)資料會(huì)不斷更新,不斷完善,幫助用戶快速入門,大大提升研發(fā)速度。 文檔
    發(fā)表于 10-18 11:12

    三相電路原理(第十一章)

    三相電路原理(第十一章)  11-1 三相電路 11-2 線電壓(電流)與相電壓(電流)的關(guān)系 11-3 對(duì)稱三相電路的計(jì)算 11-4 不對(duì)稱三相電路的概念&nb
    發(fā)表于 05-23 11:44 ?53次下載

    模擬電路網(wǎng)絡(luò)課件 第十一節(jié):小信號(hào)模型分析法

    模擬電路網(wǎng)絡(luò)課件 第十一節(jié):小信號(hào)模型分析法 3.4 小信號(hào)模型分析法
    發(fā)表于 09-17 09:53 ?8691次閱讀
    模擬電路網(wǎng)絡(luò)課件 <b class='flag-5'>第十一</b>節(jié):小信號(hào)模型分析法

    第十一屆高交會(huì)電子展今日開鑼

    第十一屆高交會(huì)電子展今日開鑼 2009年11月16日9:46:07第十一屆高交會(huì)電子展(ELEXCON 2009)將于11月16日~21日在深圳會(huì)展中心2號(hào)館隆重舉
    發(fā)表于 11-16 09:46 ?790次閱讀

    第十一屆藍(lán)橋杯嵌入式設(shè)計(jì)與開發(fā) (省賽)

    第十一屆藍(lán)橋杯嵌入式設(shè)計(jì)與開發(fā) (省賽)分析此次賽題圍繞兩個(gè)方向,結(jié)構(gòu)如下:代碼:1.主函數(shù)模塊main.c#include #include
    發(fā)表于 11-03 15:36 ?21次下載
    <b class='flag-5'>第十一</b>屆藍(lán)橋杯嵌入式設(shè)計(jì)與<b class='flag-5'>開發(fā)</b> (省賽)

    第十一屆藍(lán)橋杯單片機(jī)模擬題--智能門鎖

    第十一屆藍(lán)橋杯單片機(jī)模擬題--智能門鎖
    發(fā)表于 11-30 10:21 ?18次下載
    <b class='flag-5'>第十一</b>屆藍(lán)橋杯單片機(jī)模擬題--智能門鎖

    【正點(diǎn)原子FPGA連載】第十一章觸摸按鍵控制LED燈實(shí)驗(yàn) -摘自【正點(diǎn)原子】新起點(diǎn)之FPGA開發(fā)指南_V2.1

    :http://www.openedv.com/thread-300792-1-1.html3)對(duì)正點(diǎn)原子FPGA感興趣的同學(xué)可以加群討論:9942440164)關(guān)注正點(diǎn)原子公眾號(hào),獲取最新資料更新第十一章觸摸按鍵控制LED燈實(shí)驗(yàn)隨著電子技術(shù)的不斷發(fā)展,按鍵的應(yīng)用場(chǎng)景越來越廣泛。觸摸按鍵在穩(wěn)定性、使用壽命、
    發(fā)表于 12-31 19:21 ?9次下載
    【正點(diǎn)原子FPGA連載】<b class='flag-5'>第十一章</b>觸摸按鍵控制LED燈實(shí)驗(yàn) -摘自【正點(diǎn)原子】新起點(diǎn)之FPGA<b class='flag-5'>開發(fā)</b>指南_V2.1
    主站蜘蛛池模板: 欧美日韩国产一区二区 | 综合视频网 | 免费在线视频观看 | 天天综合干 | 国产小视频在线 | 一级做a爰片久久毛片看看 一级做a爰片久久毛片毛片 | 窝窝午夜看片成人精品 | 九九热精品国产 | 婷婷六月丁香午夜爱爱 | 婷婷激情小说 | 最新国产厕所 | 操综合| 色播丁香 | 视频在线播放免费 | 91视频毛片 | 偷偷鲁影院手机在线观看 | 激情 婷婷 | 午夜在线视频观看 | 日韩欧美亚洲综合一区二区 | 中文字幕三级久久久久久 | h视频免费看 | 日韩一级一片 | 亚洲综合色就色手机在线观看 | 国产伦精品一区二区三区在线观看 | 色多多污网站在线观看 | 男女交黄 | 婷婷六月激情在线综合激情 | avtt加勒比手机版天堂网 | 一级特黄性生活大片免费观看 | 午夜乩伦| av在线天堂网 | 久久综合色区 | 神马午夜第九 | 综合色影院 | 久久免 | 欧美在线播放 | a成人毛片免费观看 | 色综合久久综合 | 国产老头和美女在线观看 | 黄页网站在线 | 玖玖国产|