Thread 中讨论的其他器件:C2000WARE
工具与软件:
你好。
面对使用 cmpss 获得占空比的问题,我想比较正弦波和三角波并产生占空比,如果正弦波>三角波 PWM 应该是50%其他0使用 cmpss
这是代码,产生正弦波和三角波 ,但不产生占空比,你能告诉我在这个代码中有什么错误吗
#include "F28x_Project.h"
#include "driverlib.h"
#include "device.h"
#include
#define NUM_SAMPLES 100
#define SINE_FREQUENCY 50
#define Triangal_frequency 25.
#define SAMPLING_RATE 5000
#define DAC_MAX_VALUE 4095
#define PI 3.14159265358979323846
float sine_wave[NUM_SAMPLES];
float Triangal_wave[NUM_SAMPLE];
void DAC_init ();
void DAC_WRITE_DACA (uint16_t 值);
void DAC_WRITE_DACB (uint16_t 值);
void generate_sine_wave();
void generate_detail_wave();
void initEPWM1 (void);
void PinMux_init ();
void CMPSS_init (void);
void main (void)
{
device_init();
device_initGPIO();
Interrupt_initModule();
interrupt_initVectorTable();
PinMux_init();
SYSCTL_disablePeripheral (SYSCTL_PERIPH_CLK_TBCLKSYNC);
initEPWM1();
CMPSS_INIT ();
SYSCTL_enablePeripheral (SYSCTL_PERIPH_CLK_TBCLKSYNC);
EINT;
ERTM;
dac_init();
generate_sine_wave();
generate_detangal_wave();
while (1)
{
内部 j;
对于(j = 0;j < NUM_SAMPLES;j++)
{
uint16_t DIGITAL_SINE_VALUE =(uint16_t)(SINE_Wave[j]* DAC_MAX_VALUE/3.3);
uint16_t digital_tripletal_value =(uint16_t)(Triangal_wave[j]* DAC_MAX_VALUE/3.3);
DAC_WRITE_DACA (digital_sine_value);
DAC_WRITE_DACB (DIGITAL_TRIGANCE_VALUE);
如果(Cmpss1Regs.COMPSTS.bit.COMPHSTS == 1){
EPwm1Regs.CMPA.bit.CMPA = EPwm1Regs.TBPRD/2;//设置50%占空比
其他{
EPwm1Regs.CMPA.bit.CMPA = 0;//设置0%占空比
}
DELAY_US (1000000 / SAMPLING_RATE);
}
}
}
void DAC_init()
{
EALLOW;
//初始化 DAC-A
DacaRegs.DACCTL.bit.DACREFSEL = 1;// Use internal reference (使用内部基准)
DacaRegs.DACCTL.bit.LOADMODE = 1;// Load DACVALS register (从 DACVALS 寄存器加载 DACVALS)
DacaRegs.DACOUTEN.bit.DACOUTEN = 1;// Enable DAC output
//初始化 DAC-B
DacbRegs.DACCTL.bit.DACREFSEL = 1;// Use internal reference (使用内部基准)
DacbRegs.DACCTL.bit.LOADMODE = 1;// Load DACVALS register (从 DACVALS 寄存器加载 DACVALS)
DacbRegs.DACOUTEN.bit.DACOUTEN = 1;// Enable DAC output
EDIS;
}
void DAC_WRITE_DACA (uint16_t 值)
{
DacaRegs.DACVALS.bit.DACVALS = value;
}
void DAC_WRITE_DACB (uint16_t 值)
{
DacbRegs.DACVALS.bit.DACVALS = value;
}
void generate_sine_wave()
{
内部 j;
float time_step = 1.0/SAMPLING_RATE;
对于(j = 0;j < NUM_SAMPLES;j++)
{
float time = j * time_step;
sine_wave[j]= 1.65 + 1.65 * sin (2 * pi * sine_frequency * time);
}
}
void generate_detail_wave()
{
内部 j;
浮点周期= 1.0/三角频率;
float time_step = period / NUM_SAMPLES;
对于(j = 0;j < NUM_SAMPLES;j++)
{
float time = j * time_step;
float phase = fmod (time * Triangal_frequency、1.0);
if (PHASE < 0.5)
{
Triangal_wave[j]= 1.65 + 1.65 *(2 *相位);//升序部分以1.65V 为中心
}
设计
{
Triangal_wave[j]= 1.65 + 1.65 *(2 - 2 *相位);//降序部分以1.65V 为中心
}
}
}
void initEPWM1()
{
EPwm1Regs.TBPRD = 4095;
EPwm1Regs.TBPHS.bit.TBPHS = 0x0000;
EPwm1Regs.TBCTR = 0x0000;
EPwm1Regs.CMPA.bit.CMPA = 2047;
EPwm1Regs.TBCTL.bit.CTRMODE = tb_count_updown;
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm1Regs.AQCTLA.bit.CAU = AQ_clear;
EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;
//配置 ePWM1以将 CMPSS 用于跳闸区域
EALLOW;
EPwm1Regs.TZSEL.bit.OSHT1 = 1;//一次性跳闸1
EPwm1Regs.TZCTL.bit.tZA = TZ_FORCE_HI;//在 TRIP A 上强制设置为高电平
EDIS;
}
void PinMux_init()
{
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO0=1;
GpioDataRegs.GPACLEAR.bit.GPIO0=1;
EDIS;
}
void CMPSS_init (void)
{
EALLOW;
//启用 CMPSS1并将 DAC 设置为负输入
Cmpss1Regs.COMPCTL.bit.COMPDACE = 1;//启用 DAC
//配置比较器负输入(三角波)
Cmpss1Regs.COMPCTL.bit.COMPLSOURCE = 0;//将 DAC 用作比较器负输入
Cmpss1Regs.DACHVALS.bit.DACVAL = 2047;//设置中点(1.65V)
//配置比较器正输入(正弦波)
Cmpss1Regs.COMPCTL.bit.COMPHSOURCE = 1;//将 DAC 用作比较器正输入
//配置比较器的输出
Cmpss1Regs.COMPCTL.bit.COMPHINV = 0;//正常极性
Cmpss1Regs.COMPCTL.bit.CTRIPHSEL = 1;// CTRIPH 为 CTRIPOUT (已过滤)
//配置数字滤波器设置(如果需要)
Cmpss1Regs.COMPHYSCTL.bit.COMPHYS = 0;//无迟滞
//配置 ePWM1以将 CMPSS 用于跳闸区域
EPwm1Regs.TZSEL.bit.OSHT1 = 1;//一次性跳闸1
EPwm1Regs.TZCTL.bit.tZA = TZ_FORCE_HI;//在 TRIP A 上强制设置为高电平
EDIS;
}