我不知道如何控制 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 输出,但不幸的是没有。
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
}
}