控制 PIC16F1575 上的 PWM 模块

问题描述 投票:0回答:1

我不知道如何控制 PIC 微控制器上的 PWM 信号,因为大多数在线指南似乎都包含 CCP 模块,而我的系统没有。

#include "config.h"

#define _XTAL_FREQ 16000000

//short pwmModule = PWM1CONbits.OUT; //Global variable for pin select
    
void main( void ){
    
    // <editor-fold defaultstate="collapsed" desc="Oscillator Register">
        //Configure the oscillator block(16MHz)
    OSCCONbits.SPLLEN = 0b0;  //ignored due to config
    OSCCONbits.IRCF = 0b1111; //16MHz
    OSCCONbits.SCS = 0b00; //sets clock determined by config
    OSCTUNEbits.TUN = 0b000000; //sets factory calibrated oscillator 
    
    // </editor-fold>
    // <editor-fold defaultstate="collapsed" desc="PWM Register">
 
    PWM1CONbits.EN = 0b1; //enable PWM bit
    PWM1CONbits.POL = 0b0; //polarity not inverted
    PWM1CONbits.MODE = 0b00; //standard mode
    PWM1CONbits.OE = 0b1; //
    
    PWM1CLKCONbits.PS = 0b001; //divide clock by 2 for source pwm 16M/2
    PWM1CLKCONbits.CS = 0b01; //use high frequency internal oscillator
    
    PWM1OFCONbits.OFM = 0b00; //independant run mode 
    
    
    
    
    // </editor-fold>
        // <editor-fold defaultstate="collapsed" desc="I/O Configurations">
    //Configure the pins as output
    TRISCbits.TRISC0 = 0;
    TRISCbits.TRISC1 = 0;
    TRISAbits.TRISA4 = 0;
    TRISAbits.TRISA5 = 0;

    
    //Clear the output pins    
    LATCbits.LATC0 = 0;
    LATCbits.LATC1 = 0;
    LATAbits.LATA4 = 0;
    LATAbits.LATA5 = 0;

    
    //Configure the pins as input
    TRISAbits.TRISA2 = 1;
    
    //Configure the inputs pins as digital
    ANSELAbits.ANSA2 = 0;    
    // </editor-fold>
    

    while(1){
        
        LATCbits.LATC0 = PWM1CONbits.OUT;
       
        
    }
    
    
    
    return;
}

我编写了这个程序,并尝试测量输出只是为了看看是否有任何 PWM 输出,但不幸的是没有。

c embedded pic
1个回答
0
投票

PIC16F1575 是一个相对较新的型号,不是常见的教材。 这就是为什么您很难找到一些合适的教程。

该型号的不同之处在于它没有捆绑 CCP(捕获比较 PWM)硬件,但仅限 PWM 硬件。不仅, 与经典的相比,其 PWM 硬件结构略有不同 型号。

我知道阅读数据表可能具有挑战性,但我建议您 查看您设备的数据表,至少仅查看您的部分 需要 PWM、GPIO 和 PPS 等。

这里有一个荣誉奖:有一个叫做 MCC 的工具 Microchip 向开发人员提供的 (Mplab Code Configurator),以便他们直观地配置大量支持的 PIC 模型并生成驱动程序代码 硬件。您可以利用此工具来加快开发过程并 让事情变得更容易。不过我建议您查看相关部分 在数据表中查看硬件级别的情况。

下面是一个示例代码,我尚未测试并鼓励您这样做 因为你有真正的硬件。将其视为启动您的示例 项目不是一个完整的项目。

所以根据数据表,有 4 个独立的 PWM 模块可以运行 独立或依赖或通过提供一些触发源。 但这里我们将它们用作独立的 PWM。下表显示了每个 PWM 模块的配置方式以及每个引脚上应看到的内容:

没有 输出引脚 频率 占空比
PWM1 PORTC0 100Hz %40
PWM2 C1 口 200Hz %50
PWM3 PORTC2 500Hz %60
PWM4 PORTC3 1KHz %70
void OSCILLATOR_Initialize(void) {
    // SCS INTOSC; SPLLEN disabled; IRCF 16MHz_HF; 
    OSCCON = 0x7A;
    // TUN 0; 
    OSCTUNE = 0x00;
    // SBOREN disabled; BORFS disabled; 
    BORCON = 0x00;
}

void PIN_MANAGER_Initialize(void) {
    /**
    LATx registers
    */
    LATA = 0x00;
    LATC = 0x00;

    /**
    TRISx registers
    */
    TRISA = 0x3F;
    TRISC = 0x30;

    /**
    ANSELx registers
    */
    ANSELC = 0x00;
    ANSELA = 0x17;

    /**
    WPUx registers
    */
    WPUA = 0x00;
    WPUC = 0x00;
    OPTION_REGbits.nWPUEN = 1;

    /**
    ODx registers
    */
    ODCONA = 0x00;
    ODCONC = 0x00;

    /**
    SLRCONx registers
    */
    SLRCONA = 0x37;
    SLRCONC = 0x3F;

    /**
    INLVLx registers
    */
    INLVLA = 0x3F;
    INLVLC = 0x3F;
    
    RC0PPS = 0x03;   //RC0->PWM1:PWM1OUT;    
    RC3PPS = 0x06;   //RC3->PWM4:PWM4OUT;    
    RC1PPS = 0x04;   //RC1->PWM2:PWM2OUT;    
    RC2PPS = 0x05;   //RC2->PWM3:PWM3OUT;    
}

void PWM1_Initialize(void) {
    // set the PWM1 to the options selected in the User Interface

     //PHIE disabled; DCIE disabled; OFIE disabled; PRIE disabled; 
    PWM1INTE = 0x00;

     //PHIF cleared; OFIF cleared; DCIF cleared; PRIF cleared; 
    PWM1INTF = 0x00;

     //PS Divide_clock_src_by_4; CS HFINTOSC; 
    PWM1CLKCON = 0x21;

     //LDS LD1_trigger; LDT disabled; LDA do_not_load; 
    PWM1LDCON = 0x00;

     //OFM independent_run; OFS OF1_match; OFO match_incrementing; 
    PWM1OFCON = 0x00;

     //PWM1PHH 0; 
    PWM1PHH = 0x00;

     //PWM1PHL 0; 
    PWM1PHL = 0x00;

     //PWM1DCH 62; 
    PWM1DCH = 0x3E;

     //PWM1DCL 127; 
    PWM1DCL = 0x7F;

     //PWM1PRH 156; 
    PWM1PRH = 0x9C;

     //PWM1PRL 63; 
    PWM1PRL = 0x3F;

     //PWM1OFH 0; 
    PWM1OFH = 0x00;

     //PWM1OFL 7; 
    PWM1OFL = 0x07;

     //PWM1TMRH 0; 
    PWM1TMRH = 0x00;

     //PWM1TMRL 0; 
    PWM1TMRL = 0x00;

     //MODE standard_PWM; POL active_hi; EN enabled; 
    PWM1CON = 0x80;
}

void PWM2_Initialize(void) {
    // set the PWM2 to the options selected in the User Interface

     //PHIE disabled; DCIE disabled; OFIE disabled; PRIE disabled; 
    PWM2INTE = 0x00;

     //PHIF cleared; OFIF cleared; DCIF cleared; PRIF cleared; 
    PWM2INTF = 0x00;

     //PS Divide_clock_src_by_4; CS FOSC; 
    PWM2CLKCON = 0x20;

     //LDS LD1_trigger; LDT disabled; LDA do_not_load; 
    PWM2LDCON = 0x00;

     //OFM independent_run; OFS OF1_match; OFO match_incrementing; 
    PWM2OFCON = 0x00;

     //PWM2PHH 0; 
    PWM2PHH = 0x00;

     //PWM2PHL 0; 
    PWM2PHL = 0x00;

     //PWM2DCH 39; 
    PWM2DCH = 0x27;

     //PWM2DCL 15; 
    PWM2DCL = 0x0F;

     //PWM2PRH 78; 
    PWM2PRH = 0x4E;

     //PWM2PRL 31; 
    PWM2PRL = 0x1F;

     //PWM2OFH 0; 
    PWM2OFH = 0x00;

     //PWM2OFL 7; 
    PWM2OFL = 0x07;

     //PWM2TMRH 0; 
    PWM2TMRH = 0x00;

     //PWM2TMRL 0; 
    PWM2TMRL = 0x00;

     //MODE standard_PWM; POL active_hi; EN enabled; 
    PWM2CON = 0x80;
}

void PWM3_Initialize(void) {
    // set the PWM3 to the options selected in the User Interface

     //PHIE disabled; DCIE disabled; OFIE disabled; PRIE disabled; 
    PWM3INTE = 0x00;

     //PHIF cleared; OFIF cleared; DCIF cleared; PRIF cleared; 
    PWM3INTF = 0x00;

     //PS Divide_clock_src_by_4; CS HFINTOSC; 
    PWM3CLKCON = 0x21;

     //LDS LD1_trigger; LDT disabled; LDA do_not_load; 
    PWM3LDCON = 0x00;

     //OFM independent_run; OFS OF1_match; OFO match_incrementing; 
    PWM3OFCON = 0x00;

     //PWM3PHH 0; 
    PWM3PHH = 0x00;

     //PWM3PHL 0; 
    PWM3PHL = 0x00;

     //PWM3DCH 18; 
    PWM3DCH = 0x12;

     //PWM3DCL 192; 
    PWM3DCL = 0xC0;

     //PWM3PRH 31; 
    PWM3PRH = 0x1F;

     //PWM3PRL 64; 
    PWM3PRL = 0x40;

     //PWM3OFH 0; 
    PWM3OFH = 0x00;

     //PWM3OFL 7; 
    PWM3OFL = 0x07;

     //PWM3TMRH 0; 
    PWM3TMRH = 0x00;

     //PWM3TMRL 0; 
    PWM3TMRL = 0x00;

     //MODE standard_PWM; POL active_hi; EN enabled; 
    PWM3CON = 0x80;
}

void PWM4_Initialize(void) {
    // set the PWM4 to the options selected in the User Interface

     //PHIE disabled; DCIE disabled; OFIE disabled; PRIE disabled; 
    PWM4INTE = 0x00;

     //PHIF cleared; OFIF cleared; DCIF cleared; PRIF cleared; 
    PWM4INTF = 0x00;

     //PS Divide_clock_src_by_4; CS HFINTOSC; 
    PWM4CLKCON = 0x21;

     //LDS LD1_trigger; LDT disabled; LDA do_not_load; 
    PWM4LDCON = 0x00;

     //OFM independent_run; OFS OF1_match; OFO match_incrementing; 
    PWM4OFCON = 0x00;

     //PWM4PHH 0; 
    PWM4PHH = 0x00;

     //PWM4PHL 0; 
    PWM4PHL = 0x00;

     //PWM4DCH 10; 
    PWM4DCH = 0x0A;

     //PWM4DCL 240; 
    PWM4DCL = 0xF0;

     //PWM4PRH 15; 
    PWM4PRH = 0x0F;

     //PWM4PRL 160; 
    PWM4PRL = 0xA0;

     //PWM4OFH 0; 
    PWM4OFH = 0x00;

     //PWM4OFL 7; 
    PWM4OFL = 0x07;

     //PWM4TMRH 0; 
    PWM4TMRH = 0x00;

     //PWM4TMRL 0; 
    PWM4TMRL = 0x00;

     //MODE standard_PWM; POL active_hi; EN enabled; 
    PWM4CON = 0x80;
}

void SYSTEM_Initialize(void) {
    PIN_MANAGER_Initialize();
    OSCILLATOR_Initialize();
    WDT_Initialize();
    PWM1_Initialize();
    PWM2_Initialize();
    PWM4_Initialize();
    PWM3_Initialize();
}

void main(void) {
    // initialize the device
    SYSTEM_Initialize();

    while(1) {
        // Add your application code
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.