blob: d720a988cbdfec8ca526eec3b6bb2d58f21a6706 [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- This is broken by doc revisioning.
-->
<link rel="shortcut icon" href="../../../../../img/favicon.ico">
<title>PWM - Apache Mynewt</title>
<link href="../../../../../css/bootstrap-3.0.3.min.css" rel="stylesheet">
<link rel="stylesheet" href="../../../../../css/highlight.css">
<link href="../../../../../css/base.css" rel="stylesheet">
<link href="../../../../../css/custom.css" rel="stylesheet">
<link href="../../../../../css/v2.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/css?family=Lato" rel="stylesheet">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css">
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
<![endif]-->
<script>
(function(i, s, o, g, r, a, m) {
i["GoogleAnalyticsObject"] = r;
(i[r] =
i[r] ||
function() {
(i[r].q = i[r].q || []).push(arguments);
}),
(i[r].l = 1 * new Date());
(a = s.createElement(o)), (m = s.getElementsByTagName(o)[0]);
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m);
})(window, document, "script", "//www.google-analytics.com/analytics.js", "ga");
ga("create", "UA-72162311-1", "auto");
ga("send", "pageview");
</script>
</head>
<body class="PWM">
<div class="container">
<div class="row v2-main-banner">
<a class="logo-cell" href="/">
<img class="logo" src="/img/logo.png">
</a>
<div class="tagline-cell">
<h4 class="tagline">An OS to build, deploy and securely manage billions of devices</h4>
</div>
<div class="news-cell">
<div class="well">
<h4>Latest News:</h4> <a href="/download">Apache Mynewt 1.11.0, Apache NimBLE 1.6.0 </a> released (September 7, 2023)
</div>
</div>
</div>
</div>
<nav id="navbar" class="navbar navbar-inverse affix-top" data-spy="affix" data-offset-top="150" role="navigation">
<div class="container">
<!-- Collapsed navigation -->
<div class="navbar-header">
<!-- Expander button -->
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>
<!-- Expanded navigation -->
<div class="navbar-collapse collapse">
<!-- Main navigation -->
<ul class="nav navbar-nav navbar-right">
<li
class=""
>
<a href="/"><i class="fa fa-home" style="font-size: larger;"></i></a>
</li>
<li
class="important"
>
<a href="/quick-start/">Quick Start</a>
</li>
<li
class=""
>
<a href="/about/">About</a>
</li>
<li
class=""
>
<a href="/talks/">Talks</a>
</li>
<li
class="active"
>
<a href="/documentation/">Documentation</a>
</li>
<li
class=""
>
<a href="/download/">Download</a>
</li>
<li
class=""
>
<a href="/community/">Community</a>
</li>
<li
class=""
>
<a href="/events/">Events</a>
</li>
</ul>
</div>
</div>
</nav>
<div class="container">
<div class="row">
<div class="col-md-3 v2-sidebar sidebar-container"><div id="docSidebar" class="hidden-print" role="complementary">
<div class="top">
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../../../../search.html" method="get">
<div class="form-group">
<input type="text" name="q" class="form-control" placeholder="Search documentation" />
</div>
</form>
</div>
</div>
<ul class="toc-nav">
<li class="doc-version"><select class="form-control" onchange="if (this.value) window.location.href=this.value">
<option value="/latest">
Version: master
</option>
<option value="/v1_11_0/" >
Version: 1.11.0
</option>
<option value="/v1_10_0/" >
Version: 1.10.0
</option>
<option value="/v1_9_0/" >
Version: 1.9.0
</option>
<option value="/v1_8_0/" >
Version: 1.8.0
</option>
<option value="/v1_7_0/" >
Version: 1.7.0
</option>
<option value="/v1_6_0/" >
Version: 1.6.0
</option>
<option value="/v1_5_0/" >
Version: 1.5.0
</option>
<option value="/v1_4_0/" >
Version: 1.4.0
</option>
<option value="/v1_3_0/os/introduction" >
Version: 1.3.0
</option>
<option value="/v1_2_0/os/introduction" >
Version: 1.2.0
</option>
<option value="/v1_1_0/os/introduction" >
Version: 1.1.0
</option>
<option value="/v1_0_0/os/introduction" >
Version: 1.0.0
</option>
<option value="/v0_9_0/os/introduction" selected="selected" >
Version: 0.9.0
</option>
</select></li>
<li ><a href="../../../../introduction/">Mynewt Documentation</a>
<ul>
<li ><a href="../../../../get_started/get_started/">Basic Setup</a>
</li>
<li >
<a href="../../../../get_started/vocabulary/">Concepts</a>
</li>
<li ><a href="../../../../tutorials/tutorials/">Tutorials</a>
</li>
<li ><a href="../../../../os_user_guide/">OS User Guide</a>
<ul>
<li ><a href="../../../../core_os/mynewt_os/">OS Core</a>
</li>
<li ><a href="../../../../core_os/porting/port_os/">Porting to your Platform</a>
</li>
<li ><a href="../../../console/console/">Console</a>
</li>
<li ><a href="../../../shell/shell/">Shell</a>
</li>
<li ><a href="../../../bootloader/bootloader/">Bootloader</a>
</li>
<li><a href="
../../../fs/fs/fs/
">File System</a>
</li>
<li ><a href="../../hal/">Hardware Abstraction Layer</a>
<ul>
<li >
<a href="../../hal_architecture/">Architecture</a>
</li>
<li><a href="
../../hal_api/
">API</a>
<ul>
<li >
<a href="../../hal_api/">Summary</a>
</li>
<li >
<a href="../../hal_adc/hal_adc/">ADC</a>
</li>
<li >
<a href="../../hal_cputime/hal_cpu_timer/">CPU timer</a>
</li>
<li >
<a href="../../hal_dac/hal_dac/">DAC</a>
</li>
<li><a href="
../../hal_flash/hal_flash/
">Flash memory</a>
</li>
<li >
<a href="../../hal_gpio/hal_gpio/">GPIO</a>
</li>
<li >
<a href="../../hal_i2c/hal_i2c/">I2C</a>
</li>
<li class="active">
<a href="./">PWM</a>
</li>
<li >
<a href="../../hal_spi/hal_spi/">SPI</a>
</li>
<li >
<a href="../../hal_system/hal_sys/">System</a>
</li>
<li >
<a href="../../hal_uart/hal_uart/">UART</a>
</li>
</ul>
</li>
<li >
<a href="../../hal_in_libraries/">Using HAL</a>
</li>
<li >
<a href="../../hal_creation/">Creating HAL</a>
</li>
</ul>
</li>
<li ><a href="../../../testutil/testutil/">Test Utilities</a>
</li>
<li ><a href="../../../imgmgr/imgmgr/">Image Manager</a>
</li>
<li >
<a href="../../../baselibc/">Baselibc library</a>
</li>
<li ><a href="../../../elua/elua/">Embedded Lua</a>
</li>
<li ><a href="../../../json/json/">JSON</a>
</li>
<li ><a href="../../../stats/stats/">Stats</a>
</li>
<li ><a href="../../../logs/logs/">Logs</a>
</li>
</ul>
</li>
<li><a href="
../../../../../network/ble/ble_intro/
">BLE User Guide</a>
</li>
<li ><a href="../../../../../newt/newt_intro/">Newt Tool Guide</a>
</li>
<li ><a href="../../../../../newtmgr/overview/">Newt Manager Guide</a>
</li>
<li >
<a href="../../../../../known_issues/">Known Issues</a>
</li>
</ul>
</li>
<li><a href="
../../../../../faq/how_to_edit_docs/
">Appendix</a>
</li>
</ul>
</div></div>
<div class="col-md-9" role="main">
<div class="doc-header">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="/documentation/">Docs</a></li>
<li>&raquo; <a href="os/modules/hal/hal_api/">API</a></li>
<li>&raquo; <a href="os/modules/hal/hal/">Hardware Abstraction Layer</a></li>
<li>&raquo; <a href="os/os_user_guide/">OS User Guide</a></li>
<li>&raquo; <a href="os/introduction/">Mynewt Documentation</a></li>
<li>&raquo; PWM</li>
</ul>
</div>
</div>
<div class="alert alert-warning">
<p>
Version 0.9.0 is not the most recent version of the Apache Mynewt
documentation. Click <a href="/latest">here</a> to read the latest
version.
</p>
</div>
<h1 id="hal_pwm">hal_pwm</h1>
<p>The hardware independent interface to Pulse Width Modulators</p>
<h3 id="description">Description</h3>
<p>Pulse Width Modulators (PWMs) are hardware devices that output digital waveforms
with programmable duty cycle and frequency. They use a digital waveform
but can contiuously adjust the amount of power delivered to their load via
duty cycle. They are often used to create analog waveforms via low pass filter,
drive LEDs at various intensities, and control DC or servo motors.</p>
<p>For a description of PSM, see <a href="https://en.wikipedia.org/wiki/Pulse-width_modulation">wikipedia</a></p>
<h3 id="definition">Definition</h3>
<p><a href="https://github.com/apache/incubator-mynewt-larva/blob/master/hw/hal/include/hal/hal_pwm.h">hal_pwm.h</a></p>
<h3 id="hal_pwm-theory-of-operation">HAL_PWM Theory Of Operation</h3>
<p>The HAL_PWM interface was designed with some specific use cases in mind. It
was also designed to exploit a subset of the functionality provided by
common PWM controllers.</p>
<p>Fundamentally, a PWM has at it root an N-bit COUNTER, a CLOCK source, one or
more CAPTURE registers, and sometimes a TOP register.</p>
<p>The clock source feeds the COUNTER register which is continuously counting
(up or down), When the COUNTER is less than the value of the CAPTURE
register, the PWM outputs a logic HIGH. When the counter is greater than
the CAPTURE register the PWM outputs logic LOW. When the counter reaches the TOP
register, it wraps back to zero. If the PWM has no TOP register, it simply
wraps back to zero after reaching 2^N-1.</p>
<p>The HAL_PWM abstracts this implementation and provides methods to set the
PWM frequency and duty cycle. The frequency is the rate at which the counter
wraps back to zero. The duty cycle is the fraction of time the PWM is in
logic HIGH state.</p>
<p>The HAL_PWM API provides a few methods to get information on the PWM.</p>
<table>
<thead>
<tr>
<th><strong>Method Name</strong></th>
<th>** Description **</th>
</tr>
</thead>
<tbody>
<tr>
<td>hal_pwm_get_source_clock_freq</td>
<td>gets the frequency of the CLOCK that is driving the COUNTER</td>
</tr>
<tr>
<td>hal_pwm_get_resolution_bits</td>
<td>gets the number of bits in the COUNTER</td>
</tr>
</tbody>
</table>
<p>To use a PWM via HAL_PWM, follow these simple steps.</p>
<p>1) initialize a PWM using <code>hal_pwm_init</code> -- this binds the driver to the device
for the specific PWM you are using
2) Optionally set the frequency of the PWM using <code>hal_pwm_set_frequency</code>
-- PWMs that support a TOP register have fine control over their frequency
settings. If this command is not supported by the PWM it will return an error
and its likely that there is no TOP register; the frequency resolution is not
finely adjustable. See the BSP for coarse adjustment of the PWM frequency.<br />
3) Enable the PWM to output a specific duty cycle using the
<code>hal_pwm_enable_duty_cycle</code> API</p>
<p>To change the duty cycle dynamically, just issue another
<code>hal_pwm_enable_duty_cycle</code> command.</p>
<p>To disable the PWM waveform, use <code>hal_pwm_disable</code>.</p>
<div class="row">
<ul class="nav nav-pills" style="margin-bottom: 10px">
<li>
</li>
<li class="pull-right">
</li>
</ul>
</div>
<footer class="row">
<div class="col-xs-12">
<p class="copyright">Apache Mynewt (incubating) is available under Apache License, version 2.0.</p>
</div>
<div class="col-xs-12">
<div class="logos">
<a href="https://www.apache.org/">
<img src="/img/asf_logo_wide_small.png" alt="Apache" title="Apache">
</a>
<p>
Copyright © 2015-2021 The Apache Software Foundation.<br>
<small class="footnote">
Apache Mynewt, Mynewt, Apache, the Apache feather logo, and the Apache Mynewt
project logo are either registered trademarks or trademarks of the Apache
Software Foundation in the United States and other countries.
</small>
</p>
<a href="">
<img src="https://www.countit.com/images/add_to_slack.png" alt="Slack Icon" title="Join our Slack Community" />
</a>
</div>
</div>
<a href="https://www.apache.org/licenses/">
<button class="button-footer-asf">
License
</button>
</a>
<a href="https://www.apache.org/foundation/sponsorship.html">
<button class="button-footer-asf">
Sponsorship
</button>
</a>
<a href="https://www.apache.org/foundation/thanks.html">
<button class="button-footer-asf">
Thanks
</button>
</a>
<a href="https://www.apache.org/security/">
<button class="button-footer-asf">
Security
</button>
</a>
<a href="https://apache.org/events/current-event">
<button class="button-footer-asf">
ASF Events
</button>
</a>
</footer>
</div>
</div>
</div>
<script src="../../../../../js/jquery-1.10.2.min.js"></script>
<script src="../../../../../js/bootstrap-3.0.3.min.js"></script>
<script src="../../../../../js/highlight.pack.js"></script>
<script src="../../../../../js/base.js"></script>
<script src="../../../../../js/custom.js"></script>
<script src="search/main.js"></script>
</body>
</html>