色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux應用開發【第十一章】PWM編程應用開發

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

文章目錄

11 PWM編程應用開發

11.1 PWM概述

11.1.1 PWM的參數說明

11.2 用戶層查看PWM

11.3 PWM的SYSFS使用

11.4 PWM應用編程

11.4.1 修改設備樹

11.4.2 修改配置文件

11.4.3 添加驅動

11.4.4 運行測試

11 PWM編程應用開發

11.1 PWM概述

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

poYBAGGzOTeAMvdqAAAzet9xcHI318.png

? PWM信號把模擬信號轉化為數字電路所需要的編碼,現在基本是采用數字電路,因此在很多場合都采用PWM信號,我們經常見到的就是交流調光電路,也可以說是無級調速,高電平占多一點,也就是占空比大一點亮度就亮一點,占空比小一點亮度就沒有那么亮,前提是PWM的頻率要大于我們人眼識別頻率,要不然會出現閃爍現象。除了在調光電路應用,還有在直流斬波電路、蜂鳴器驅動、電機驅動、逆變電路、加濕機霧化量等都會有應用。

pYYBAGGzOT6ADz5WAAAajfUkDIQ538.png

11.1.1 PWM的參數說明

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

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

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

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

0 - 禁用

1 - 啟用

11.2 用戶層查看PWM

? 如果在內核配置中啟用了CONFIG_SYSFS,則會提供一個簡單的sysfs接口來使用用戶空間的PWM。它在/ sys / class / pwm /中公開。每個被探測的PWM控制器/芯片將被輸出為pwmchipN,其中N是PWM芯片的基礎。你在目錄里面會發現:

 1 echo 0 > /sys/class/pwm/pwmchip0/export /*設置PWM4輸出,調出pwm0目錄下設備節點,用于以下配置 */
 2 echo 1000000 >/sys/class/pwm/pwmchip0/pwm0/period /*設置PWM4一個周期的持續時間,單位為ns,即1K Hz */
 3 echo 500000 >/sys/class/pwm/pwmchip0/pwm0/duty_cycle /*設置一個周期中的”ON”時間,單位為ns,即占空比=duty_cycle/period=50% */
 4 echo 1 >/sys/class/pwm/pwmchip0/pwm0/enable /*設置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應用編程

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 修改設備樹

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 添加驅動

#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
};

//定義初始化混雜設備對象
static struct miscdevice pwm_misc = {
    .minor = MISC_DYNAMIC_MINOR, //動態分配次設備號
    .name = "mypwm",             //dev/mypwm
    .fops = &pwm_fops 
};

static int pwm_init(void)
{
    int ret;
    printk("regisger pwm_misc devicen");
    //1.申請pwm資源,設置輸出為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.注冊混雜設備
    misc_register(&pwm_misc);
    return 0;
}

static void pwm_exit(void)
{
    printk("unregister pwm_misc devicen");
    //1.卸載混雜設備
    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 運行測試

#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; 
}

審核編輯 黃昊宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • PWM
    PWM
    +關注

    關注

    114

    文章

    5197

    瀏覽量

    214550
  • Linux
    +關注

    關注

    87

    文章

    11341

    瀏覽量

    210130
收藏 人收藏

    評論

    相關推薦

    明德揚視頻分享點撥FPGA課程--第十一章 ?Signaltapll的使用技巧

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

    至芯科技之altera 系列FPGA教程 第十一篇 添加激勵

    至芯科技之altera 系列FPGA教程 第十一篇 添加激勵
    發表于 08-11 03:29

    視頻詳解:上海尤老師verilog入門到實戰第十一

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

    第十一期 存儲與讀取文件

    第十一期實現寫入文件與文件的讀取操作
    發表于 09-16 12:23

    「正點原子Linux連載」第十一章模仿STM32驅動開發格式實驗

    ,獲取更多資料:正點原子第十一章模仿STM32驅動開發格式實驗 在上一章使用C語言編寫LED燈驅動的時候,每個寄存器的地址我們都需要寫宏定義,使用起來非常的不方便。我們在學習STM32的時候,可以
    發表于 12-20 15:03

    藍橋杯第十一屆省賽單片機組

    藍橋杯第十一屆省賽單片機組,翻了下以前做過的一些項目和比賽,發現了之前準備比賽的一些注意事項和心得,分享給大家希望大家能夠避免錯誤拿高分。 適當的延時很重要,可以解決一些不正常現象ds1302讀取
    發表于 07-14 06:57

    迅為iMX6ULL開發板使用手冊資料下載

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

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

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

    更新 | 持續開源 迅為RK3568驅動指南第十一篇-pinctrl子系統

    《iTOP-RK3568開發板驅動開發指南》更新,本次更新內容對應的是驅動(第十一期_pinctrl子系統-全新升級)視頻,后續資料會不斷更新,不斷完善,幫助用戶快速入門,大大提升研發速度。 文檔
    發表于 10-18 11:12

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

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

    模擬電路網絡課件 第十一節:小信號模型分析法

    模擬電路網絡課件 第十一節:小信號模型分析法 3.4 小信號模型分析法
    發表于 09-17 09:53 ?8656次閱讀
    模擬電路網絡課件 <b class='flag-5'>第十一</b>節:小信號模型分析法

    第十一屆高交會電子展今日開鑼

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

    第十一屆藍橋杯嵌入式設計與開發 (省賽)

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

    第十一屆藍橋杯單片機模擬題--智能門鎖

    第十一屆藍橋杯單片機模擬題--智能門鎖
    發表于 11-30 10:21 ?17次下載
    <b class='flag-5'>第十一</b>屆藍橋杯單片機模擬題--智能門鎖

    【正點原子FPGA連載】第十一章觸摸按鍵控制LED燈實驗 -摘自【正點原子】新起點之FPGA開發指南_V2.1

    :http://www.openedv.com/thread-300792-1-1.html3)對正點原子FPGA感興趣的同學可以加群討論:9942440164)關注正點原子公眾號,獲取最新資料更新第十一章觸摸按鍵控制LED燈實驗隨著電子技術的不斷發展,按鍵的應用場景越來越廣泛。觸摸按鍵在穩定性、使用壽命、
    發表于 12-31 19:21 ?9次下載
    【正點原子FPGA連載】<b class='flag-5'>第十一章</b>觸摸按鍵控制LED燈實驗 -摘自【正點原子】新起點之FPGA<b class='flag-5'>開發</b>指南_V2.1
    主站蜘蛛池模板: 久久国语露脸精品国产 | 美女被爆羞羞天美传媒 | 女人精69xxxxx | 国产毛片A级久久久不卡精品 | 亚洲国产欧美国产综合在线 | 亚洲视频免费在线观看 | 亚洲精品不卡在线 | 亚洲精品入口一区二区乱麻豆精品 | 做暖暖视频在线看片免费 | 黑人巨茎vide抽搐 | 亚州精品视频 | 99久久久无码国产精品不卡按摩 | 99热久久视频只有精品6 | 国产精品成人在线播放 | 国产亚洲福利精品一区 | 色四房播播 | 国产精品高清视亚洲一区二区 | jizz老太婆| 国产亚洲精品视频亚洲香蕉视 | 国外成人电台 | 亚洲成人在线免费观看 | 女同志videos最新另 | 男人的天堂色偷偷 | 久久理论片 | CHINA篮球体育飞机2023 | 精品一品国产午夜福利视频 | 日本综艺大尺度无删减版在线 | 精品亚洲欧美中文字幕在线看 | 免费观看激烈日板子 | 超碰97人人做人人爱亚洲尤物 | 伊人久久大香线蕉综合电影网 | 成人天堂婷婷青青视频在线观看 | 激情A片久久久久久久 | 中文字幕精品在线观看 | 国产午夜福利片 | 免费色片播放器 | 四虎永久免费 | 男子扒开美女尿口做羞羞的事 | www.狠狠色| 狠狠色丁香婷婷久久综合五月 | 国产a视频视卡在线 |