ele-diary 趣味の電子工作ブログ

電子工作関係の記録です。

PIC32MX210xFの実験(PWM)

32bitタイマでPWMの実験をしてみました。

PWMの周期を変えていくサンプル。うねうね動きます。

回路図

f:id:pau2000:20170610161316j:plain

最低限でもこれくらいはいりそうです。電解コンデンサは内部のオシレータに必要です。VUSB3V3は、USBを使わないときに接続するようデータシートに指示があります。

コード

PIC32のTimer23(32ビットタイマ)の出力をOC1につないでPWMを実現しています。開発環境はMPLAB X IDE 3.50とXC32コンパイラPLIBはLecacyライブラリを使ってます。 harmonyという新しい開発環境があるんですが、あえて使っていません。ちょっと把握しづらいので。。

/*********************************************************************
 *
 *      PIC32MX210F016B test
 *
 *      Y.U 7/June/2017
 * 
 *  ********************************************************************/

#include <plib.h>
#include <stdlib.h>

// SYSCLK = 40 MHz (8MHz Crystal/ FPLLIDIV * FPLLMUL / FPLLODIV)
// PBCLK  = 40 MHz
#define SYSCLK  40000000L                      
#define SYSCLKdiv10MHz    (SYSCLK/10000000)    

// Configuration Bit
// DEVCFG3:
#pragma config IOL1WAY  = OFF           // Peripheral Pin Select Configuration
// DEVCFG2:
#pragma config FPLLODIV = DIV_2         // PLL Output Divider
#pragma config UPLLEN   = OFF           // USB PLL Enabled
#pragma config UPLLIDIV = DIV_2         // USB PLL Input Divider
#pragma config FPLLMUL  = MUL_20        // PLL Multiplier
#pragma config FPLLIDIV = DIV_2         // PLL Input Divider
// DEVCFG1:
#pragma config FWDTEN   = OFF           // Watchdog Timer
#pragma config WDTPS    = PS1           // Watchdog Timer Postscale
#pragma config FCKSM    = CSDCMD        // Clock Switching & Fail Safe Clock Monitor
#pragma config FPBDIV   = DIV_1         // Peripheral Clock divisor
#pragma config OSCIOFNC = OFF           // CLKO Enable
#pragma config POSCMOD  = OFF           // Primary Oscillator
#pragma config IESO     = OFF           // Internal/External Switch-over
#pragma config FSOSCEN  = OFF           // Secondary Oscillator Enable (KLO was off)
#pragma config FNOSC    = FRCPLL        // Oscillator Selection
// DEVCFG0:
#pragma config CP       = OFF           // Code Protect
#pragma config BWP      = ON            // Boot Flash Write Protect
#pragma config PWP      = OFF           // Program Flash Write Protect
#pragma config ICESEL   = ICS_PGx3      // ICE/ICD Comm Channel Select
#pragma config JTAGEN   = OFF           // JTAG Enable
#pragma config DEBUG    = OFF           // Background Debugger Enable

void delay_us(unsigned int usec);
void delay_ms(unsigned int msec);

#define _SUPPRESS_PLIB_WARNING

int main(void)
{

    //System Setting
    SYSTEMConfigPerformance(SYSCLK);    //????????
    mJTAGPortEnable(DEBUG_JTAGPORT_OFF); //PORTA is used I/O, JTAG port must be disabled.

    mPORTAClearBits( BIT_4 | BIT_3 | BIT_2 | BIT_1 | BIT_0 );
    mPORTASetPinsDigitalOut( BIT_4 | BIT_3 | BIT_2 | BIT_1 | BIT_0 );
    ConfigCNBPullups(CNB13_PULLUP_ENABLE);//RB13??????
    mPORTBClearBits( BIT_5 );           //RB5?Low?

    mPORTBSetPinsDigitalOut( BIT_5 );   //RB5???

    //delay_ms(2000);                     //2???
    mPORTBClearBits( BIT_5 );           //RB5?Low?

    
    OpenTimer23(T23_ON | T23_SOURCE_INT | T23_PS_1_1,256);
    
    OpenOC1(OC_ON | //PWM mode
      OC_TIMER_MODE32 | //32bit
      OC_TIMER2_SRC | //
      OC_PWM_FAULT_PIN_DISABLE, //
      128, //OCxRS
      128); //OCxR
    
    RPB4Rbits.RPB4R = 0b0101; //RB4->OC1
   

    int cnt1=0,cnt2=0;
    while(1)
    {
        mPORTBToggleBits( BIT_5 );     //RB5 toggle for test
        delay_us(50);
        cnt1++;
        
        if (cnt1==128){
            cnt1=0;
            cnt2++;
            SetDCOC1PWM(cnt2);             
            if (cnt2==255){
                cnt2=0;

            }
        }

    }
}


void delay_us(unsigned int usec){
    unsigned int i, delay;

    delay = usec * SYSCLKdiv10MHz;
    for(i=0; i<delay; i++){}
}

void delay_ms(unsigned int msec){
    unsigned int i;

    for(i=0; i<msec; i++)
        delay_us(1000);
}
'''[f:id:pau2000:20170610161316j:plain]