<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://devzone.nordicsemi.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>#nrf52840: create 2 PWMs with different pulse width using single instance by direct register access</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/30328/nrf52840-create-2-pwms-with-different-pulse-width-using-single-instance-by-direct-register-access</link><description>As per #nrf52840 datasheet 
 NRF_P0-&amp;gt;DIR |= 0x0001E000; NRF_P0-&amp;gt;OUT |= 0x0001E000; uint16_t pwm_seq[4]= {160 , 3200}; NRF_PWM0-&amp;gt;PSEL.OUT[0] = 0; NRF_PWM0-&amp;gt;PSEL.OUT[0] = 13 ; 
 NRF_PWM0-&amp;gt;PSEL.OUT[1] = 0 ; NRF_PWM0-&amp;gt;PSEL.OUT[1] = 14 ; 
 NRF_PWM0-&amp;gt;ENABLE</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Mon, 12 Feb 2018 19:12:05 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/30328/nrf52840-create-2-pwms-with-different-pulse-width-using-single-instance-by-direct-register-access" /><item><title>RE: #nrf52840: create 2 PWMs with different pulse width using single instance by direct register access</title><link>https://devzone.nordicsemi.com/thread/120623?ContentTypeID=1</link><pubDate>Mon, 12 Feb 2018 19:12:05 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:2db3b4aa-c86c-406a-8cc2-0554683a9929</guid><dc:creator>vikrant8051</dc:creator><description>&lt;p&gt;I referred #nrf52840 Datasheet. It is same as your suggestion but&amp;nbsp; with my style. And it is very simple compare to using combo of PPI &amp;amp; Timer.&lt;/p&gt;
&lt;p&gt;And it works &amp;amp; that&amp;#39;s it !!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: #nrf52840: create 2 PWMs with different pulse width using single instance by direct register access</title><link>https://devzone.nordicsemi.com/thread/120554?ContentTypeID=1</link><pubDate>Mon, 12 Feb 2018 11:48:54 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:0deca17f-3a50-456e-85d6-15925721ebc1</guid><dc:creator>Edvin</dc:creator><description>&lt;p&gt;Hello,&lt;/p&gt;
&lt;p&gt;I am not quite sure where you found this piece of code, but it can be a bit confusing, since all of our PWM examples are set up in different ways, using different modules.&lt;/p&gt;
&lt;p&gt;The &amp;quot;best&amp;quot; way is to use the timer and PPI, do manage the PWM signals directly. However, it does not use the PWM module. Only a timer and GPIO control.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;In the &lt;a href="http://infocenter.nordicsemi.com/pdf/nRF52840_OPS_v0.5.1.pdf" rel="noopener noreferrer" target="_blank"&gt;Product Specification&lt;/a&gt;, on page 559 is an example on one way to use the PWM module, which looks similar to the way that you set it up.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Below, I modified this to match your pins.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="c_cpp"&gt;int main(void)
{
    uint16_t pwm_seq[4] =
        {
            1600, 3200};

    NRF_PWM0-&amp;gt;PSEL.OUT[0] = (13 &amp;lt;&amp;lt; PWM_PSEL_OUT_PIN_Pos) | (PWM_PSEL_OUT_CONNECT_Connected &amp;lt;&amp;lt; PWM_PSEL_OUT_CONNECT_Pos);

    NRF_PWM0-&amp;gt;PSEL.OUT[1] = (14 &amp;lt;&amp;lt; PWM_PSEL_OUT_PIN_Pos) | (PWM_PSEL_OUT_CONNECT_Connected &amp;lt;&amp;lt; PWM_PSEL_OUT_CONNECT_Pos);

    NRF_PWM0-&amp;gt;ENABLE = (PWM_ENABLE_ENABLE_Enabled &amp;lt;&amp;lt; PWM_ENABLE_ENABLE_Pos);

    NRF_PWM0-&amp;gt;MODE = (PWM_MODE_UPDOWN_Up &amp;lt;&amp;lt; PWM_MODE_UPDOWN_Pos);

    NRF_PWM0-&amp;gt;PRESCALER = (PWM_PRESCALER_PRESCALER_DIV_1 &amp;lt;&amp;lt; PWM_PRESCALER_PRESCALER_Pos);

    NRF_PWM0-&amp;gt;COUNTERTOP = (16000 &amp;lt;&amp;lt; PWM_COUNTERTOP_COUNTERTOP_Pos); //1 msec

    NRF_PWM0-&amp;gt;LOOP = (PWM_LOOP_CNT_Disabled &amp;lt;&amp;lt; PWM_LOOP_CNT_Pos);

    NRF_PWM0-&amp;gt;DECODER = (PWM_DECODER_LOAD_Individual &amp;lt;&amp;lt; PWM_DECODER_LOAD_Pos) | (PWM_DECODER_MODE_RefreshCount &amp;lt;&amp;lt; PWM_DECODER_MODE_Pos);

    NRF_PWM0-&amp;gt;SEQ[0].PTR = ((uint32_t)(pwm_seq) &amp;lt;&amp;lt; PWM_SEQ_PTR_PTR_Pos);

    NRF_PWM0-&amp;gt;SEQ[0].CNT = ((sizeof(pwm_seq) / sizeof(uint16_t)) &amp;lt;&amp;lt; PWM_SEQ_CNT_CNT_Pos);

    NRF_PWM0-&amp;gt;SEQ[0].REFRESH = 0;

    NRF_PWM0-&amp;gt;SEQ[0].ENDDELAY = 0;

    NRF_PWM0-&amp;gt;TASKS_SEQSTART[0] = 1;

    while (true)
    {
        // Do nothing.
        nrf_delay_ms(1000);                 // Wait for one second
        
        if (pwm_seq[0] == 3200)             // Toggle between two duty cycles on channel 0
            pwm_seq[0] = 1600;
        else
            pwm_seq[0] = 3200;
        
        NRF_PWM0-&amp;gt;TASKS_SEQSTART[0] = 1;    // Update the PWM module
    }
}&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Note that the nrf_delay_ms() is a very little power efficient function. I used it because it is easy to set up to show how to update the PWM&amp;#39; duty cycle.&lt;/p&gt;
&lt;p&gt;If you paste this code into e.g. the example found in SDK\examples\peripheral\template_project, you will see that LED1 and LED2 is controlled by the PWM, and the intensity of LED1 is toggling between two values.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Best Regards,&lt;/p&gt;
&lt;p&gt;Edvin&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: #nrf52840: create 2 PWMs with different pulse width using single instance by direct register access</title><link>https://devzone.nordicsemi.com/thread/120260?ContentTypeID=1</link><pubDate>Thu, 08 Feb 2018 12:11:47 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:7f366e91-781c-42ac-8076-9a3bece85f22</guid><dc:creator>vikrant8051</dc:creator><description>&lt;p&gt;Hello World !!&lt;/p&gt;
&lt;p&gt;Here answering my own question....&lt;/p&gt;
&lt;p&gt;I found that working of PWM module depends upon sequence of configuration.&lt;/p&gt;
&lt;p&gt;Here is simple working demo,&lt;/p&gt;
&lt;p&gt;//---------------------------------------------------------------------------------------------------------------------------------------------------------&lt;/p&gt;
&lt;p&gt;#include &amp;quot;nrf_delay.h&amp;quot;&lt;br /&gt;&lt;br /&gt;uint16_t pwm_seq[4];&lt;br /&gt;&lt;br /&gt;void gpio_init(void)&lt;br /&gt;{&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp; NRF_P0-&amp;gt;DIR |= 0x0001E000;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; NRF_P0-&amp;gt;OUT |= 0x0001E000;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp; NRF_PWM0-&amp;gt;PSEL.OUT[0] = 13 ;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // LED_1&lt;br /&gt;&amp;nbsp; NRF_PWM0-&amp;gt;PSEL.OUT[1] = 14 ;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // LED_2&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; NRF_PWM0-&amp;gt;MODE = 0x00000000;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; NRF_PWM0-&amp;gt;PRESCALER = 0x00000004; //1 Mhz&lt;br /&gt;&lt;br /&gt;&amp;nbsp; NRF_PWM0-&amp;gt;COUNTERTOP = 1000;&amp;nbsp; //1 Khz&lt;br /&gt;&lt;br /&gt;&amp;nbsp; NRF_PWM0-&amp;gt;DECODER = 0x00000002;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; NRF_PWM0-&amp;gt;LOOP = 0x00000000;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; NRF_PWM0-&amp;gt;SEQ[0].REFRESH = 0;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; NRF_PWM0-&amp;gt;SEQ[0].ENDDELAY = 0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; NRF_PWM0-&amp;gt;SEQ[0].PTR = (uint32_t)(pwm_seq);&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; NRF_PWM0-&amp;gt;SEQ[0].CNT = 4;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; NRF_PWM0-&amp;gt;ENABLE = 0x00000001;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; NRF_PWM0-&amp;gt;TASKS_SEQSTART[0] = 1;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;int main(void)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp; unsigned char data=0;&lt;br /&gt;&amp;nbsp; int i;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; gpio_init();&lt;br /&gt;&lt;br /&gt;&amp;nbsp; while(1)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pwm_seq[0] += 10;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pwm_seq[1] += 100;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NRF_PWM0-&amp;gt;TASKS_SEQSTART[0] = 1;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(pwm_seq[0] &amp;gt; 1000)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pwm_seq[0] = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(pwm_seq[1] &amp;gt; 1000)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pwm_seq[1] = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; nrf_delay_ms(100);&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; return(0);&lt;br /&gt;&lt;br /&gt;}&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>