blob: c08b88cf156b6b0edc273fcadfd61bf962eb4fd3 [file] [log] [blame]
<!--
Documentation/_templates/layout.html
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership. The
ASF licenses this file to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance with the
License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
License for the specific language governing permissions and limitations
under the License.
-->
<!DOCTYPE html>
<html class="writer-html5" lang="en">
<head>
<meta charset="utf-8" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>PWM Drivers &mdash; NuttX latest documentation</title>
<link rel="stylesheet" type="text/css" href="../../../../_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="../../../../_static/css/theme.css" />
<link rel="stylesheet" type="text/css" href="../../../../_static/copybutton.css" />
<link rel="stylesheet" type="text/css" href="../../../../_static/sphinx_collapse.css" />
<link rel="stylesheet" type="text/css" href="../../../../_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css" />
<link rel="stylesheet" type="text/css" href="../../../../_static/custom.css" />
<link rel="shortcut icon" href="../../../../_static/favicon.ico"/>
<script src="../../../../_static/jquery.js"></script>
<script src="../../../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script data-url_root="../../../../" id="documentation_options" src="../../../../_static/documentation_options.js"></script>
<script src="../../../../_static/doctools.js"></script>
<script src="../../../../_static/sphinx_highlight.js"></script>
<script src="../../../../_static/clipboard.min.js"></script>
<script src="../../../../_static/copybutton.js"></script>
<script src="../../../../_static/design-tabs.js"></script>
<script src="../../../../_static/js/theme.js"></script>
<link rel="index" title="Index" href="../../../../genindex.html" />
<link rel="search" title="Search" href="../../../../search.html" />
<link rel="next" title="Watchdog Timer Drivers" href="watchdog.html" />
<link rel="prev" title="Timer Drivers" href="timer.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../../../../index.html" class="icon icon-home"> NuttX
</a>
<!-- this version selector is quite ugly, should be probably replaced by something
more modern -->
<div class="version-selector">
<select onchange="javascript:location.href = this.value;">
<option value="../../../../../latest" selected="selected">latest</option>
<option value="../../../../../10.0.0" >10.0.0</option>
<option value="../../../../../10.0.1" >10.0.1</option>
<option value="../../../../../10.1.0" >10.1.0</option>
<option value="../../../../../10.2.0" >10.2.0</option>
<option value="../../../../../10.3.0" >10.3.0</option>
<option value="../../../../../11.0.0" >11.0.0</option>
<option value="../../../../../12.0.0" >12.0.0</option>
<option value="../../../../../12.1.0" >12.1.0</option>
<option value="../../../../../12.2.0" >12.2.0</option>
<option value="../../../../../12.2.1" >12.2.1</option>
<option value="../../../../../12.3.0" >12.3.0</option>
<option value="../../../../../12.4.0" >12.4.0</option>
<option value="../../../../../12.5.0" >12.5.0</option>
<option value="../../../../../12.5.1" >12.5.1</option>
<option value="../../../../../12.6.0" >12.6.0</option>
<option value="../../../../../12.7.0" >12.7.0</option>
<option value="../../../../../12.8.0" >12.8.0</option>
<option value="../../../../../12.9.0" >12.9.0</option>
<option value="../../../../../12.10.0" >12.10.0</option>
<option value="../../../../../12.11.0" >12.11.0</option>
</select>
</div>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
<p class="caption" role="heading"><span class="caption-text">Table of Contents</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../../../../index.html">Home</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../introduction/index.html">Introduction</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../quickstart/index.html">Getting Started</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../contributing/index.html">Contributing</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../introduction/inviolables.html">The Inviolable Principles of NuttX</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../platforms/index.html">Supported Platforms</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../../../index.html">OS Components</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="../../../binfmt.html">Binary Loader</a></li>
<li class="toctree-l2 current"><a class="reference internal" href="../../index.html">Device Drivers</a><ul class="current">
<li class="toctree-l3 current"><a class="reference internal" href="../index.html">Character Device Drivers</a><ul class="current">
<li class="toctree-l4"><a class="reference internal" href="../1wire.html">One Wire Drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="../analog/index.html">Analog (ADC/DAC) Drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="../bch.html">Block Driver to Character Driver</a></li>
<li class="toctree-l4"><a class="reference internal" href="../can.html">CAN Drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="../contactless.html">Constactless Devices</a></li>
<li class="toctree-l4"><a class="reference internal" href="../crypto/index.html">Crypto Drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="../efuse.html">EFUSE Drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="../i2s.html">I2S Drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="../input/index.html">Input Devices</a></li>
<li class="toctree-l4"><a class="reference internal" href="../ipcc.html">IPCC (Inter Processor Communication Controller) Driver</a></li>
<li class="toctree-l4"><a class="reference internal" href="../leds/index.html">LEDS</a></li>
<li class="toctree-l4"><a class="reference internal" href="../loop.html">Loop Device</a></li>
<li class="toctree-l4"><a class="reference internal" href="../math.html">Math Acceleration Drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="../modem.html">Modem Device</a></li>
<li class="toctree-l4"><a class="reference internal" href="../motor/index.html">Motor Drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="../note.html">Note Driver Interface</a></li>
<li class="toctree-l4"><a class="reference internal" href="../nullzero.html"><code class="docutils literal notranslate"><span class="pre">dev_null.c</span></code> and <code class="docutils literal notranslate"><span class="pre">dev_zero.c</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="../quadrature.html">Quadrature Encoder Drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="../rc.html">Remote Control Devices</a></li>
<li class="toctree-l4"><a class="reference internal" href="../rf.html">RF Devices</a></li>
<li class="toctree-l4"><a class="reference internal" href="../serial.html">Serial Device Drivers</a></li>
<li class="toctree-l4 current"><a class="reference internal" href="index.html">Timers Drivers</a><ul class="current">
<li class="toctree-l5"><a class="reference internal" href="timer.html">Timer Drivers</a></li>
<li class="toctree-l5 current"><a class="current reference internal" href="#">PWM Drivers</a></li>
<li class="toctree-l5"><a class="reference internal" href="watchdog.html">Watchdog Timer Drivers</a></li>
<li class="toctree-l5"><a class="reference internal" href="rtc.html">RTC Drivers</a></li>
<li class="toctree-l5"><a class="reference internal" href="capture.html">Capture</a></li>
</ul>
</li>
<li class="toctree-l4"><a class="reference internal" href="../touchscreen.html">Touchscreen Device Drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="../wireless/index.html">Wireless character drivers</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../../block/index.html">Block Device Drivers</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../special/index.html">Specialized Device Drivers</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../thermal/index.html">Thermal Framework</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../index.html#lower-half-and-upper-half">Lower-half and upper-half</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../index.html#subdirectories-of-nuttx-drivers">Subdirectories of <code class="docutils literal notranslate"><span class="pre">nuttx/drivers</span></code></a></li>
<li class="toctree-l3"><a class="reference internal" href="../../index.html#skeleton-files">Skeleton Files</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../index.html#drivers-early-initialization">Drivers Early Initialization</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../../../nxflat.html">NXFLAT</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../nxgraphics/index.html">NX Graphics Subsystem</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../paging.html">On-Demand Paging</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../audio/index.html">Audio Subsystem</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../filesystem/index.html">NuttX File System</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../libs/index.html">NuttX libraries</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../net/index.html">Network Support</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../mm/index.html">Memory Management</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../syscall.html">Syscall Layer</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../tools/index.html"><code class="docutils literal notranslate"><span class="pre">/tools</span></code> Host Tools</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../arch/index.html">Architecture-Specific Code</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../boards.html">Boards Support</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../cmake.html">CMake Support</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../openamp.html">OpenAMP Support</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../video.html">Video Subsystem</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../crypto.html">Crypto API Subsystem</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../wireless.html">Wireless Subsystem</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../../../applications/index.html">Applications</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../implementation/index.html">Implementation Details</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../reference/index.html">API Reference</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../faq/index.html">FAQ</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../debugging/index.html">Debugging</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../guides/index.html">Guides</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../standards/index.html">Standards</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../glossary.html">Glossary</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../logos/index.html">NuttX Logos</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../_tags/tagsindex.html">Tags</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../../../index.html">NuttX</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Page navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../../../index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item"><a href="../../../index.html">OS Components</a></li>
<li class="breadcrumb-item"><a href="../../index.html">Device Drivers</a></li>
<li class="breadcrumb-item"><a href="../index.html">Character Device Drivers</a></li>
<li class="breadcrumb-item"><a href="index.html">Timers Drivers</a></li>
<li class="breadcrumb-item active">PWM Drivers</li>
<li class="wy-breadcrumbs-aside">
<a href="https://github.com/apache/nuttx/blob/master/Documentation/components/drivers/character/timers/pwm.rst" class="fa fa-github"> Edit on GitHub</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="pwm-drivers">
<h1>PWM Drivers<a class="headerlink" href="#pwm-drivers" title="Permalink to this heading"></a></h1>
<p>For the purposes of this driver, a PWM device is any device that
generates periodic output pulses of controlled frequency and pulse
width. Such a device might be used, for example, to perform
pulse-width modulated output or frequency/pulse-count modulated
output (such as might be needed to control a stepper motor).</p>
<p>The NuttX PWM driver is split into two parts:</p>
<ol class="arabic simple">
<li><p>An “upper half”, generic driver that provides the common PWM
interface to application level code, and</p></li>
<li><p>A “lower half”, platform-specific driver that implements the
low-level timer controls to implement the PWM functionality.</p></li>
</ol>
<p>Files supporting PWM can be found in the following locations:</p>
<ul class="simple">
<li><p><strong>Interface Definition</strong>. The header file for the NuttX PWM
driver reside at <code class="docutils literal notranslate"><span class="pre">include/nuttx/timers/pwm.h</span></code>. This header
file includes both the application level interface to the PWM
driver as well as the interface between the “upper half” and
“lower half” drivers. The PWM module uses a standard character
driver framework. However, since the PWM driver is a device
control interface and not a data transfer interface, the
majority of the functionality available to the application is
implemented in driver ioctl calls.</p></li>
<li><p><strong>“Upper Half” Driver</strong>. The generic, “upper half” PWM driver
resides at <code class="docutils literal notranslate"><span class="pre">drivers/timers/pwm.c</span></code>.</p></li>
<li><p><strong>“Lower Half” Drivers</strong>. Platform-specific PWM drivers reside
in <code class="docutils literal notranslate"><span class="pre">arch/&lt;architecture&gt;/src/&lt;hardware&gt;</span></code>
directory for the specific processor <code class="docutils literal notranslate"><span class="pre">&lt;architecture&gt;</span></code> and for
the specific <code class="docutils literal notranslate"><span class="pre">&lt;chip&gt;</span></code> PWM peripheral devices.</p></li>
</ul>
<section id="application-level-interface">
<h2>Application Level Interface<a class="headerlink" href="#application-level-interface" title="Permalink to this heading"></a></h2>
<p>The first necessary thing to be done in order to use the PWM driver in an
application is to include the header file for the NuttX timer driver. It contains
the Application Level Interface to the PWM driver. To do so, include:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;nuttx/timers/pwm.h&gt;</span>
</pre></div>
</div>
<p>PWM driver is registered as a POSIX character device file into <code class="docutils literal notranslate"><span class="pre">/dev</span></code>
namespace. It is necessary to open the device to get a file descriptor for
further operations.</p>
<p>The PWM is accessed only through <code class="docutils literal notranslate"><span class="pre">ioctl</span></code> interface, functions <code class="docutils literal notranslate"><span class="pre">read</span></code>
and <code class="docutils literal notranslate"><span class="pre">write</span></code> does not have any affect. Following <code class="docutils literal notranslate"><span class="pre">ioctl</span></code> commands are
available:</p>
<blockquote>
<div><ul class="simple">
<li><p><a class="reference internal" href="#c.PWMIOC_SETCHARACTERISTICS" title="PWMIOC_SETCHARACTERISTICS"><code class="xref c c-macro docutils literal notranslate"><span class="pre">PWMIOC_SETCHARACTERISTICS</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.PWMIOC_GETCHARACTERISTICS" title="PWMIOC_GETCHARACTERISTICS"><code class="xref c c-macro docutils literal notranslate"><span class="pre">PWMIOC_GETCHARACTERISTICS</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.PWMIOC_START" title="PWMIOC_START"><code class="xref c c-macro docutils literal notranslate"><span class="pre">PWMIOC_START</span></code></a></p></li>
<li><p><code class="xref c c-macro docutils literal notranslate"><span class="pre">PWMIOC_STOP</span></code></p></li>
</ul>
</div></blockquote>
<dl class="c macro">
<dt class="sig sig-object c" id="c.PWMIOC_SETCHARACTERISTICS">
<span class="sig-name descname"><span class="n"><span class="pre">PWMIOC_SETCHARACTERISTICS</span></span></span><a class="headerlink" href="#c.PWMIOC_SETCHARACTERISTICS" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<p>The <code class="docutils literal notranslate"><span class="pre">PWMIOC_SETCHARACTERISTICS</span></code> command sets PWM characteristics such as
frequency, duty cycle, dead times and so on. These characteristics are
set through <code class="docutils literal notranslate"><span class="pre">pwm_info_s</span></code> structure.</p>
<dl class="c struct">
<dt class="sig sig-object c" id="c.pwm_info_s">
<span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">pwm_info_s</span></span></span><a class="headerlink" href="#c.pwm_info_s" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="k">struct</span><span class="w"> </span><span class="nc">pwm_info_s</span>
<span class="p">{</span>
<span class="w"> </span><span class="cm">/* Frequency of the pulse train */</span>
<span class="w"> </span><span class="kt">uint32_t</span><span class="w"> </span><span class="n">frequency</span><span class="p">;</span>
<span class="cp">#ifdef CONFIG_PWM_MULTICHAN</span>
<span class="w"> </span><span class="cm">/* Per-channel output state */</span>
<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">pwm_chan_s</span><span class="w"> </span><span class="n">channels</span><span class="p">[</span><span class="n">CONFIG_PWM_NCHANNELS</span><span class="p">];</span>
<span class="cp">#else</span>
<span class="w"> </span><span class="cm">/* Duty of the pulse train, &quot;1&quot;-to-&quot;0&quot; duration.</span>
<span class="cm"> * Maximum: 65535/65536 (0x0000ffff)</span>
<span class="cm"> * Minimum: 1/65536 (0x00000001)</span>
<span class="cm"> */</span>
<span class="w"> </span><span class="n">ub16_t</span><span class="w"> </span><span class="n">duty</span><span class="p">;</span>
<span class="cp">#ifdef CONFIG_PWM_DEADTIME</span>
<span class="w"> </span><span class="cm">/* Dead time value for main output */</span>
<span class="w"> </span><span class="n">ub16_t</span><span class="w"> </span><span class="n">dead_time_a</span><span class="p">;</span>
<span class="w"> </span><span class="cm">/* Dead time value for complementary output */</span>
<span class="w"> </span><span class="n">ub16_t</span><span class="w"> </span><span class="n">dead_time_b</span><span class="p">;</span>
<span class="cp">#endif</span>
<span class="cp">#ifdef CONFIG_PWM_PULSECOUNT</span>
<span class="w"> </span><span class="cm">/* The number of pulse to generate. 0 means to</span>
<span class="cm"> * generate an indefinite number of pulses</span>
<span class="cm"> */</span>
<span class="w"> </span><span class="kt">uint32_t</span><span class="w"> </span><span class="n">count</span><span class="p">;</span>
<span class="cp">#endif</span>
<span class="w"> </span><span class="cm">/* Channel polarity */</span>
<span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">cpol</span><span class="p">;</span>
<span class="w"> </span><span class="cm">/* Disabled channel polarity */</span>
<span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">dcpol</span><span class="p">;</span>
<span class="cp">#endif </span><span class="cm">/* CONFIG_PWM_MULTICHAN */</span>
<span class="w"> </span><span class="cm">/* User provided argument to be used in the lower half */</span>
<span class="w"> </span><span class="n">FAR</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="n">arg</span><span class="p">;</span>
<span class="p">};</span>
</pre></div>
</div>
<p>Structure <code class="docutils literal notranslate"><span class="pre">pwm_chan_s</span></code> holds the representation of one PWM channel
if multiple channels are used ( <code class="docutils literal notranslate"><span class="pre">CONFIG_PWM_MULTICHAN</span></code> is set).</p>
<dl class="c struct">
<dt class="sig sig-object c" id="c.pwm_chan_s">
<span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">pwm_chan_s</span></span></span><a class="headerlink" href="#c.pwm_chan_s" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="k">struct</span><span class="w"> </span><span class="nc">pwm_chan_s</span>
<span class="p">{</span>
<span class="w"> </span><span class="cm">/* Duty of the pulse train, &quot;1&quot;-to-&quot;0&quot; duration.</span>
<span class="cm"> * Maximum: 65535/65536 (0x0000ffff)</span>
<span class="cm"> * Minimum: 1/65536 (0x00000001)</span>
<span class="cm"> */</span>
<span class="w"> </span><span class="n">ub16_t</span><span class="w"> </span><span class="n">duty</span><span class="p">;</span>
<span class="cp">#ifdef CONFIG_PWM_OVERWRITE</span>
<span class="w"> </span><span class="cm">/* Channel overwrite */</span>
<span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="n">ch_outp_ovrwr</span><span class="p">;</span>
<span class="w"> </span><span class="cm">/* Channel overwrite value */</span>
<span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="n">ch_outp_ovrwr_val</span><span class="p">;</span>
<span class="cp">#endif</span>
<span class="cp">#ifdef CONFIG_PWM_DEADTIME</span>
<span class="w"> </span><span class="cm">/* Dead time value for main output */</span>
<span class="w"> </span><span class="n">ub16_t</span><span class="w"> </span><span class="n">dead_time_a</span><span class="p">;</span>
<span class="w"> </span><span class="cm">/* Dead time value for complementary output */</span>
<span class="w"> </span><span class="n">ub16_t</span><span class="w"> </span><span class="n">dead_time_b</span><span class="p">;</span>
<span class="cp">#endif</span>
<span class="w"> </span><span class="cm">/* Channel polarity */</span>
<span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">cpol</span><span class="p">;</span>
<span class="w"> </span><span class="cm">/* Disabled channel polarity */</span>
<span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">dcpol</span><span class="p">;</span>
<span class="w"> </span><span class="cm">/* Channel number */</span>
<span class="w"> </span><span class="kt">int8_t</span><span class="w"> </span><span class="n">channel</span><span class="p">;</span>
<span class="p">};</span>
</pre></div>
</div>
<p>Apart from duty cycle and frequency, the <code class="docutils literal notranslate"><span class="pre">ioctl</span></code> command allows to
set many other PWM characteristics. These functionalities might not be
supported by all PWM controllers and user should always refer to target
documentation in this case.</p>
<p>If <code class="docutils literal notranslate"><span class="pre">CONFIG_PWM_OVERWRITE</span></code> is set and <code class="docutils literal notranslate"><span class="pre">ch_outp_ovrwr</span></code> is true, it is
possible to overwrite channel output with value set in <code class="docutils literal notranslate"><span class="pre">ch_outp_ovrwr_val</span></code>.
Configuration option <code class="docutils literal notranslate"><span class="pre">CONFIG_PWM_DEADTIME</span></code> and fields <code class="docutils literal notranslate"><span class="pre">dead_time_a</span></code>
and <code class="docutils literal notranslate"><span class="pre">dead_time_b</span></code> provides an option to set dead time between complementary
outputs. This instructs the driver to automatically insert output activation
delay for complementary PWM outputs and is useful for H-bridge motor control
for example.</p>
<p>User may also set default channel polarity <code class="docutils literal notranslate"><span class="pre">cpol</span></code> and disabled channel
polarity <code class="docutils literal notranslate"><span class="pre">dcpol</span></code>. If set to zero, default controller values (or values
determined in the configuration) are used. Following defines can be used
to set the polarities:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="cm">/* Not defined, the default output state is arch dependent */</span>
<span class="cp">#define PWM_CPOL_NDEF 0</span>
<span class="cm">/* Logical zero */</span>
<span class="cp">#define PWM_CPOL_LOW 1</span>
<span class="cm">/* Logical one */</span>
<span class="cp">#define PWM_CPOL_HIGH 2</span>
<span class="cm">/* Not defined, the default output state is arch dependent */</span>
<span class="cp">#define PWM_DCPOL_NDEF 0</span>
<span class="w"> </span><span class="cm">/* Logical zero */</span>
<span class="cp">#define PWM_DCPOL_LOW 1</span>
<span class="w"> </span><span class="cm">/* Logical one */</span>
<span class="cp">#define PWM_DCPOL_HIGH 2</span>
</pre></div>
</div>
<dl class="c macro">
<dt class="sig sig-object c" id="c.PWMIOC_GETCHARACTERISTICS">
<span class="sig-name descname"><span class="n"><span class="pre">PWMIOC_GETCHARACTERISTICS</span></span></span><a class="headerlink" href="#c.PWMIOC_GETCHARACTERISTICS" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<p>Command <code class="docutils literal notranslate"><span class="pre">PWMIOC_GETCHARACTERISTICS</span></code> operates the same way as
<code class="docutils literal notranslate"><span class="pre">PWMIOC_SETCHARACTERISTICS</span></code> but it obtains currently set values
instead of setting them.</p>
<dl class="c macro">
<dt class="sig sig-object c" id="c.PWMIOC_START">
<span class="sig-name descname"><span class="n"><span class="pre">PWMIOC_START</span></span></span><a class="headerlink" href="#c.PWMIOC_START" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<p>The <code class="docutils literal notranslate"><span class="pre">PWMIOC_START</span></code> command starts the pulsed output. Characteristics
of PWM channels should be set before this operation.</p>
<dl class="c macro">
<dt class="sig sig-object c" id="c.PWMIOC_STOPS">
<span class="sig-name descname"><span class="n"><span class="pre">PWMIOC_STOPS</span></span></span><a class="headerlink" href="#c.PWMIOC_STOPS" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<p>The <code class="docutils literal notranslate"><span class="pre">PWMIOC_STOPS</span></code> command stops the pulsed output.</p>
<dl class="c macro">
<dt class="sig sig-object c" id="c.PWMIOC_FAULTS_FETCH_AND_CLEAR">
<span class="sig-name descname"><span class="n"><span class="pre">PWMIOC_FAULTS_FETCH_AND_CLEAR</span></span></span><a class="headerlink" href="#c.PWMIOC_FAULTS_FETCH_AND_CLEAR" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<p>The <code class="docutils literal notranslate"><span class="pre">PWMIOC_FAULTS_FETCH_AND_CLEAR</span></code> command clears fault inputs. Some
faults can be latched (remain active even if the source is not active
anymore) and have to be cleared from the software. This provides an option
to clear faults from the application and re-enable PWM output. It can be
also used to fetch the current faults.</p>
<p>The call takes a pointer to <code class="docutils literal notranslate"><span class="pre">unsigned</span> <span class="pre">long</span></code> variable as an argument, a
bitmask defining which faults are to be cleared. The driver clears these
faults and fills the argument with the active faults prior to this clear.
Having the argument variable equal to zero will result in no faults cleared
but the user will get the currently active faults. If NULL is passed as
an argument, then all currently set faults are cleared and fetch is not
performed.</p>
<p>This may not be supported by all drivers.</p>
<section id="application-example">
<h3>Application Example<a class="headerlink" href="#application-example" title="Permalink to this heading"></a></h3>
<p>An example application can be found in <code class="docutils literal notranslate"><span class="pre">nuttx-apps</span></code> repository under the
path <code class="docutils literal notranslate"><span class="pre">examples/pwm</span></code>.</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>nsh&gt;<span class="w"> </span>pwm
</pre></div>
</div>
</section>
</section>
<section id="configuration">
<h2>Configuration<a class="headerlink" href="#configuration" title="Permalink to this heading"></a></h2>
<p>This section describes common PWM configuration in <code class="docutils literal notranslate"><span class="pre">Kconfig</span></code>. The reader
should refer to target documentation for target specific configuration.</p>
<p>PWM is enabled by <code class="docutils literal notranslate"><span class="pre">CONFIG_PWM</span></code> configuration option. Option
<code class="docutils literal notranslate"><span class="pre">CONFIG_PWM_MULTICHAN</span></code> selects support for multiple channels for one PWM
instance. If multiple channels are used, configuration option
<code class="docutils literal notranslate"><span class="pre">CONFIG_PWM_NCHANNELS</span></code> defines the maximum number of channels per instance.
Each timer/controller may support fewer output channels than this value.</p>
<p>Generation of pin overwrite is enabled by <code class="docutils literal notranslate"><span class="pre">CONFIG_PWM_OVERWRITE</span></code> option.
This supports generation of a pin overwrite with 0 or 1 without the need to
wait for an end of cycle.</p>
<p>The <code class="docutils literal notranslate"><span class="pre">CONFIG_PWM_DEADTIME</span></code> option brings the possibility to introduce
dead time values between complementary PWM outputs.</p>
</section>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="timer.html" class="btn btn-neutral float-left" title="Timer Drivers" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
<a href="watchdog.html" class="btn btn-neutral float-right" title="Watchdog Timer Drivers" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div>
<hr/>
<div role="contentinfo">
<p>&#169; Copyright 2023, The Apache Software Foundation.</p>
</div>
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>