chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

3天內不再提示

基于Sensor API如何添加增量型旋轉編碼器的驅動

ZephyrProject ? 來源:HalfCoder ? 作者:lgl88911 ? 2021-07-28 09:55 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

增量型旋轉編碼器作為輸入器件廣泛用于各種設備,例如汽車音響的音量調節(jié),收音機頻率調節(jié),示波器上的旋鈕。但遺憾的是在Zephyr中并沒有增量型旋轉編碼器的驅動,本文將基于現(xiàn)有的Sensor API, 說明如何添加增量型旋轉編碼器的驅動,本文不對驅動操作硬件的實現(xiàn)細節(jié)進行說明。

增量型旋轉編碼器硬件要點

本文使用的是KY-040旋轉編碼器,詳細信息見文末參考

button引腳是一個對地的開關,按壓時接地

旋轉時A/B輸出有相差的正交脈沖。

旋轉一圈產生固定數(shù)量的脈沖

旋轉時一個脈沖內旋轉軸可以有多個停留位置,例如1,2,4.

驅動

驅動API選擇

比較好的做法是為旋轉編碼器抽象新的驅動API,但新的API要進入Zephyr的主分支過程是非常漫長的,同時旋轉編碼器抽象API需要涵蓋眾多類型。因此我選用了現(xiàn)有的Senser API來對增量類型旋轉編碼器的API。

增量類型旋轉編碼器的按壓就是一個簡單的button,用gpio就可以處理,因此旋轉編碼器的驅動就只處理旋轉。編碼器的旋轉理解為是一個角度的傳感器,正反轉為轉動方向,轉動的距離就是角度,這里使用sensor API的SENSOR_CHAN_ROTATION來對其進行操控。

設備樹綁定

設備樹綁定是對旋轉編碼器的硬件進行抽象,一個增量式旋轉編碼器與旋轉相關的的硬件特性有如下信息:

輸入引腳A/B

旋轉一圈產生的脈沖

一個脈沖周期的穩(wěn)妥數(shù)量

創(chuàng)建dts/bindings/sensor/rotary-encoder.yaml內容如下

description: |

Sensor driver for the relative-axis rotary encoder

compatible: “rotary-encoder”

properties:

label:

type: string

required: true

a-gpios:

type: phandle-array

required: true

description: A pin for the encoder

b-gpios:

type: phandle-array

required: true

description: B pin for the encoder

ppr:

type: int

description: Pulse Per Revolution

required: false

spp:

type: int

description: |

Number of steps (stable states) per period

1: Full-period mode (default)

2: Half-period mode

4: Quarter-period mode

required: false

驅動代碼

從設備樹中獲取硬件信息

創(chuàng)建管理數(shù)據變量和讀取硬件信息

struct encoder_config {

const char *a_label;

const uint8_t a_pin;

const uint8_t a_flags;

const char *b_label;

const uint8_t b_pin;

const uint8_t b_flags;

const uint8_t ppr;

const uint8_t spp;

};

//創(chuàng)建管理數(shù)據和配置數(shù)據的宏

#define ENCODER_INST(n)

struct encoder_data encoder_data_##n;

const struct encoder_config encoder_cfg_##n = {

.a_label = DT_INST_GPIO_LABEL(n, a_gpios),

.a_pin = DT_INST_GPIO_PIN(n, a_gpios),

.a_flags = DT_INST_GPIO_FLAGS(n, a_gpios),

.b_label = DT_INST_GPIO_LABEL(n, b_gpios),

.b_pin = DT_INST_GPIO_PIN(n, b_gpios),

.b_flags = DT_INST_GPIO_FLAGS(n, b_gpios),

COND_CODE_0(DT_INST_NODE_HAS_PROP(n, ppr), (1), (DT_INST_PROP(n, ppr))),

COND_CODE_0(DT_INST_NODE_HAS_PROP(n, spp), (SPP_FULL), (DT_INST_PROP(n, spp))),

};

//根據設備樹對node進行初始化,會從設備樹中讀取硬件信息放在struct encoder_config變量中

DT_INST_FOREACH_STATUS_OKAY(ENCODER_INST)

驅動初始化

在啟動的POST_KERNEL階段會調用encoder_init對驅動進行初始化

int encoder_init(const struct device *dev)

{

// GPIO的配置

// GPIO中斷安裝

// 旋轉編碼器GPIO初始化狀態(tài)讀取

// 驅動初始化狀態(tài)設置

// 驅動線程創(chuàng)建

// 使能中斷

}

//注冊驅動

DEVICE_AND_API_INIT(encoder_##n, DT_INST_LABEL(n), encoder_init, &encoder_data_##n, &encoder_cfg_##n,

POST_KERNEL, CONFIG_SENSOR_INIT_PRIORITY, &encoder_driver_api);

驅動流程

旋轉編碼器依靠脈沖觸發(fā)GPIO中斷,中斷通知thread進行處理

static void encoder_a_gpio_callback(const struct device *dev, struct gpio_callback *cb,

uint32_t pins)

{

struct encoder_data *drv_data = CONTAINER_OF(cb, struct encoder_data, a_gpio_cb);

enable_int(drv_data-》dev, false);

drv_data-》intpin = 0b10;

//通知發(fā)生中斷

k_sem_give(&drv_data-》gpio_sem);

}

static void encoder_b_gpio_callback(const struct device *dev, struct gpio_callback *cb,

uint32_t pins)

{

struct encoder_data *drv_data = CONTAINER_OF(cb, struct encoder_data, b_gpio_cb);

enable_int(drv_data-》dev, false);

drv_data-》intpin = 0b01;

//通知發(fā)生中斷

k_sem_give(&drv_data-》gpio_sem);

}

static void encoder_thread(void *dev_ptr, void *p2, void *p3)

{

while (1) {

//等待中斷通知

k_sem_take(&drv_data-》gpio_sem, K_FOREVER);

//根據A/B GPIO level情況判斷正反旋轉

//更新旋轉數(shù)據

//通過trigger handle通過應用層

if (drv_data-》handler) {

drv_data-》handler(dev, drv_data-》trigger);

}

//使能中斷

enable_int(dev, true);

}

}

驅動接口實現(xiàn)

sensor的接口有5個, 詳細參考旋轉編碼器只用實現(xiàn)其中的2個既可以。

旋轉編碼器是主動輸出型設備,無需軟件觸發(fā),因此可以不必實現(xiàn)channel_fetch,只用實現(xiàn)trigger_set用于注冊觸發(fā)時的callback,實現(xiàn)channel_get用于在callback時從driver獲取旋轉的角度既可以。

12static int encoder_trigger_set(const struct device *dev, const struct sensor_trigger *trig,

sensor_trigger_handler_t handler)

{

struct encoder_data *drv_data = dev-》data;

enable_int(dev, false);

drv_data-》trigger = trig;

drv_data-》handler = handler;

enable_int(dev, true);

return 0;

}

static int encoder_channel_get(const struct device *dev, enum sensor_channel chan,

struct sensor_value *val)

{

struct encoder_data *drv_data = dev-》data;

const struct encoder_config *drv_cfg = dev-》config;

int32_t acc;

if (chan != SENSOR_CHAN_ROTATION) {

return -ENOTSUP;

}

acc = drv_data-》pulses;

val-》val1 = acc * FULL_ANGLE / (drv_cfg-》ppr * drv_cfg-》spp);

val-》val2 = acc * FULL_ANGLE - val-》val1 * (drv_cfg-》ppr * drv_cfg-》spp);

if (val-》val2) {

val-》val2 *= 1000000;

val-》val2 /= (drv_cfg-》ppr * drv_cfg-》spp);

}

return 0;

}

static const struct sensor_driver_api encoder_driver_api = {

.trigger_set = encoder_trigger_set,

.channel_get = encoder_channel_get,

};

驅動使用

添加設備樹節(jié)點

在板子的dts中添加旋轉編碼器的設備樹節(jié)點:

gpio1.22和gpio1.23是旋轉編碼器連接旋轉編碼器的A/B引腳。旋轉編碼器旋轉一圈有15個脈沖,每個脈沖下有2個穩(wěn)定狀態(tài)。

input_encoder: rotary_encoder {

compatible = “rotary-encoder”;

status = “okay”;

label = “INPUT_ENCODER”;

a-gpios = 《&gpio1 22 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)》;

b-gpios = 《&gpio1 23 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)》;

ppr = 《15》;

spp = 《2》;

};

使用代碼

void encoder_callback(const struct device *dev,

struct sensor_trigger *trigger)

{

struct sensor_value val;

//旋轉編碼器旋轉發(fā)生,從驅動讀出旋轉過的角度

sensor_channel_get(dev, SENSOR_CHAN_ROTATION, &val);

printk(“current %d.%d

”, val.val1, val.val2);

}

void main(void)

{

struct device *dev;

//獲取旋轉編碼器device

dev = device_get_binding(“INPUT_ENCODER”);

//注冊trigger callback,當旋轉發(fā)生時將調用encoder_callback

sensor_trigger_set(dev, NULL, encoder_callback);

}

以上測試測序編譯完后跑起來的效果

current 12.0

current 24.0

current 36.0

current 48.0

current 36.0

current 24.0

current 12.0

current 0.0

current -12.0

current -24.0

current -36.0

current -48.0

參考

https://zh.wikipedia.org/wiki/%E6%97%8B%E8%BD%89%E7%B7%A8%E7%A2%BC%E5%99%A8

https://elixir.bootlin.com/linux/latest/source/Documentation/devicetree/bindings/input/rotary-encoder.txt

https://www.epitran.it/ebayDrive/datasheet/25.pdf

編輯:jq

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

    關注

    1

    文章

    61

    瀏覽量

    6624

原文標題:Zephyr添加旋轉編碼器驅動

文章出處:【微信號:ZephyrProject,微信公眾號:ZephyrProject】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    旋轉增量編碼器:工業(yè)自動化的“精密之眼”

    “眼睛”,在數(shù)控機床、機器人、新能源汽車、航空航天等眾多領域發(fā)揮著不可替代的作用。 精準定位,驅動工業(yè)升級 貝弗德旋轉增量編碼器的核心價值在于將機械
    的頭像 發(fā)表于 01-21 08:49 ?456次閱讀
    <b class='flag-5'>旋轉</b>式<b class='flag-5'>增量</b><b class='flag-5'>編碼器</b>:工業(yè)自動化的“精密之眼”

    增量旋轉編碼器:工業(yè)自動化的“精密之眼”

    在鋼鐵廠的高爐旁,滾燙的鋼水在傳送帶上疾馳;在港口的起重機下,集裝箱被精準吊裝;在紡織車間里,紗線以每分鐘數(shù)萬轉的速度飛旋……這些場景背后,都藏著一雙“精密之眼”——貝弗德增量旋轉編碼器
    的頭像 發(fā)表于 12-31 08:43 ?335次閱讀
    <b class='flag-5'>增量</b><b class='flag-5'>型</b><b class='flag-5'>旋轉</b><b class='flag-5'>編碼器</b>:工業(yè)自動化的“精密之眼”

    探索AEDR - 9930E:三通道反射式增量旋轉編碼器的技術剖析

    探索AEDR - 9930E:三通道反射式增量旋轉編碼器的技術剖析 在當今的電子設備設計領域,編碼器的性能和適用性對于系統(tǒng)的整體表現(xiàn)起著至關重要的作用。今天,我們將深入探討博通(Bro
    的頭像 發(fā)表于 12-30 15:40 ?335次閱讀

    探索Broadcom AEAT - 901B系列增量式磁編碼器:特性、參數(shù)與應用

    AEAT - 901B系列是一系列增量式磁編碼器,專為360°旋轉內的角度檢測提供集成解決方案。該系列采用磁技術
    的頭像 發(fā)表于 12-30 14:05 ?453次閱讀

    旋轉編碼器增量:工業(yè)自動化領域的“精密之眼”

    在工業(yè)自動化飛速發(fā)展的今天,每一個細微的精度提升都可能帶來生產效率的巨大飛躍。而旋轉編碼器增量,作為工業(yè)自動化領域的核心元件,正以其獨特的優(yōu)勢,成為眾多行業(yè)不可或缺的“精密之眼”。 旋轉
    的頭像 發(fā)表于 12-08 08:41 ?495次閱讀
    <b class='flag-5'>旋轉</b><b class='flag-5'>編碼器</b><b class='flag-5'>增量</b>:工業(yè)自動化領域的“精密之眼”

    增量旋轉編碼器:工業(yè)自動化的“精密之眼”

    在智能制造與工業(yè)4.0的浪潮中,每一次細微的位移、每一輪精準的旋轉,都關乎著生產效率與產品品質的成敗。在這場精密制造的革命里,增量旋轉編碼器以其獨特的魅力,成為工業(yè)自動化領域不可或缺的
    的頭像 發(fā)表于 12-02 08:43 ?497次閱讀
    <b class='flag-5'>增量</b><b class='flag-5'>旋轉</b><b class='flag-5'>編碼器</b>:工業(yè)自動化的“精密之眼”

    增量編碼器工作原理是什么?

    增量編碼器工作原理是什么?增量編碼器是一種通過輸出脈沖信號來反映旋轉位置變化的傳感,廣泛應
    的頭像 發(fā)表于 09-29 11:00 ?2457次閱讀
    <b class='flag-5'>增量</b>式<b class='flag-5'>編碼器</b>工作原理是什么?

    Bourns發(fā)布全新增量式微型編碼器

    Bourns 推出 PEC04 系列 4 mm 增量式微型編碼器、PEC05 PEC05 系列 5 mm 增量式微型編碼器,以及 PEC06 型號 6 mm
    的頭像 發(fā)表于 09-22 16:05 ?1432次閱讀

    多圈增量編碼器:工業(yè)自動化中的“旋轉記憶大師”

    在工業(yè)自動化設備高速運轉的場景中,一臺風電齒輪箱的傳動軸持續(xù)旋轉了128圈,傳統(tǒng)單圈編碼器早已因數(shù)據溢出而“失憶”,而多圈增量編碼器卻能精準記錄每一圈的位移變化,為控制系統(tǒng)提供連續(xù)、
    的頭像 發(fā)表于 09-18 17:14 ?1071次閱讀

    絕對值編碼器增量編碼器相比有哪些優(yōu)勢?

    絕對值編碼器增量編碼器相比有哪些優(yōu)勢?核心功能:斷電后位置信息不丟失,絕對值編碼器:通過機械結構或電子存儲(如電池備份),能實時輸出當前位置的唯一絕對值
    的頭像 發(fā)表于 08-11 13:57 ?1990次閱讀
    絕對值<b class='flag-5'>編碼器</b>與<b class='flag-5'>增量</b>式<b class='flag-5'>編碼器</b>相比有哪些優(yōu)勢?

    增量旋轉編碼器:工業(yè)智能化的“精密羅盤”

    在工業(yè)自動化浪潮席卷全球的今天,每一個精密動作的背后都離不開傳感的精準反饋。作為工業(yè)控制領域的“隱形冠軍”,增量旋轉編碼器憑借其高性價比
    的頭像 發(fā)表于 07-30 08:33 ?768次閱讀
    <b class='flag-5'>增量</b><b class='flag-5'>型</b><b class='flag-5'>旋轉</b><b class='flag-5'>編碼器</b>:工業(yè)智能化的“精密羅盤”

    增量編碼器部分經典應用案例?,一起看看吧!

    增量編碼器在醫(yī)療器械中的實際應用案例: 在 CT 掃描設備旋轉驅動系統(tǒng)中,增量編碼器
    的頭像 發(fā)表于 07-21 11:45 ?800次閱讀
    <b class='flag-5'>增量</b><b class='flag-5'>編碼器</b>部分經典應用案例?,一起看看吧!

    增量編碼器與絕對值編碼器怎么選擇?

    在選擇增量編碼器與絕對值編碼器時,需要考慮多個因素,包括應用需求、成本、精度、可靠性以及環(huán)境適應性等。以下是對兩種
    的頭像 發(fā)表于 07-10 10:34 ?1756次閱讀

    增量光電編碼器:工業(yè)自動化領域的“隱形冠軍”

    線等核心裝備提供著關鍵的位置反饋。 精密制造的“黃金搭檔” 增量光電編碼器的核心原理基于光柵衍射與光電轉換技術。當旋轉軸帶動刻有精密透光條紋的光柵盤轉動時,LED光源發(fā)出的光線透過條
    的頭像 發(fā)表于 06-27 08:38 ?850次閱讀

    光電增量編碼器:工業(yè)自動化領域的精密之眼

    在智能制造的浪潮中,每一個微小的位移、每一次精準的旋轉,都離不開高精度傳感的默默守護。光電增量編碼器,作為工業(yè)自動化領域的“精密之眼”,
    的頭像 發(fā)表于 06-10 08:42 ?758次閱讀