PIC32MX210xFの実験(PWM)
32bitタイマでPWMの実験をしてみました。
PWMの周期を変えていくサンプル。うねうね動きます。
回路図
最低限でもこれくらいはいりそうです。電解コンデンサは内部のオシレータに必要です。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]