This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TMS320F28377S:如何获取高电平频率信号?

Guru**** 2562700 points
Other Parts Discussed in Thread: CONTROLSUITE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/640226/ccs-tms320f28377s-how-can-i-get-the-high-level-frequency-signal

器件型号:TMS320F28377S
Thread 中讨论的其他器件:controlSUITE

工具/软件:Code Composer Studio

现在,我正在尝试使用此 PIC 生成 PWM 控制的开关信号。

 我 将此程序与 C 一同使用。此程序的目的是对程序中的电流信号(余弦波)和三角波进行定频并对其进行比较。(如果电流>三角⇒Output1)

//######################################################################################################################
//
//文件:example_F28377xLaunchPadDemo.c
//
//标题:F28377S LaunchPad 开箱即用演示
//
//描述:
//! addtogroup f28377xX_Example_list
//!

开箱即用演示(LaunchPadDemo)


//!
//! 该程序是 F28377S 上预加载的演示程序
//! LaunchPad 开发套件。 程序首先刷写两个用户
//! LED。 几秒钟后、LED 停止闪烁、器件启动
//! 每秒对 ADCIN14采样一次。 如果样本大于中量程
//! 板上的红色 LED 亮起、如果较低、则蓝色 LED 亮起。
//! 样本数据也通过背面板显示在串行终端中
//! 通道 UART。 您可以通过配置串行维护来查看此数据
//! 115200波特8-N-1时连接到正确的 COM 端口。
//!
//
//######################################################################################################################
//$TI 发行版:2837xS C/C++头文件 V1.00美元
//$Release Date:2015年7月15日$
//######################################################################################################################


#include
#include
#include
#include


//@sin、exp 等
#include


#include "F28x_Project.h"// DSP28x 头文件
#include "ti_ascii.h"
#include "sci_io.h"

#define CONV_WAIT 1L//微秒以等待 ADC 转换。 所需时间更长。

//@定义 OUTPUTPIN
#define OUTPIN 14
#define OUTPIN2 16.
#define OUTPIN3 64

#define PI 3.1415926


extern void DSP28x_usDelay (uint32计数);

静态无符号短整型 IndexX=0;
静态无符号短整型索引 Y=0;

const unsigned char escRed[]={0x1B、0x5B、'3'、'1'、'm'};
const unsigned char escWhite []={0x1B、0x5B、'3'、'7'、'm'};
const unsigned char Left[]={0x1B、0x5B、'3'、'7'、'm'};
const unsigned char pucTempString[]="ADCIN14样片:";

//@电压变量
int16_t currentSample;
int16_t u;
int16_t v;

int16_t sampleADC (空)

int16_t temp;

//在 SOC0上强制转换开始
AdcaRegs.ADCSOCFRC1.ALL = 0x03;

//等待转换结束。
while (AdcaRegs.ADCINTFlG.bit.ADCINT1 = 0){}//等待 ADCINT1
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 ADCINT1

//从 SOC0获取温度传感器采样结果
temp = AdcaResultRegs.ADCRESULT1;

//返回原始温度、因为器件没有斜率/偏移值
RETURN (temp);


// CH2中的@adconvert
int16_t sampleADC2 (空)

int16_t temp2;

//在 SOC0上强制转换开始
AdcbRegs.ADCSOCFRC1.ALL = 0x03;


//等待转换结束。
while (AdcbRegs.ADCINTFlG.bit.ADCINT1 = 0){}//等待 ADCINT1
AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 ADCINT1

//从 SOC0获取温度传感器采样结果
TEMP2 = AdcbResultRegs.ADCRESULT1;

//返回原始温度、因为器件没有斜率/偏移值
return (temp2);

void drawTI 标识(void)

unsigned char ucchar、lastChar;

putchar ('\n');
while (indexY<45)

if (indexY<45){
if (IndexX<77){
ucchar = ti_ascii[indexY][IndexX++];

//我们在 TI 标识中将其变为红色
if (ucchar!='7'& lastChar ='7'){
putchar (escRed[0]);
putchar (escRed[1]);
putchar (escRed[2]);
putchar (escRed[3]);
putchar (escRed[4]);


//我们在 TI 标识中将其变为红色
if (ucChar ='7'& lastChar!='7'){
putchar (escWhite [0]);
putchar (escWhite [1]);
putchar (escWhite [2]);
putchar (escWhite [3]);
putchar (escWhite [4]);


putchar (ucchar);
lastChar = ucChar;
}否则{
ucchar = 10;
putchar (ucchar);
ucchar = 13;
putchar (ucchar);
IndexX=0;
索引 Y++;



空 clearTextBox (空)

putchar (0x08);

//移回24列
putchar (0x1B);
putchar ('[');
putchar ('2');
putchar ('6');
putchar ('D');

//上移3行
putchar (0x1B);
putchar ('[');
putchar ('3');
putchar ('a');

//更改为红色文本
putchar (escRed[0]);
putchar (escRed[1]);
putchar (escRed[2]);
putchar (escRed[3]);
putchar (escRed[4]);

printf ((char*) pucTempString);

//向下移动1行
putchar (0x1B);
putchar ('[');
putchar ('1');
putchar ('B');

//移回20列
putchar (0x1B);
putchar ('[');
putchar ('2');
putchar ('0');
putchar ('D');

//保存光标位置
putchar (0x1B);
putchar ('[');
putchar ('s');

void updateDisplay (void)(空)

//恢复光标位置
putchar (0x1B);
putchar ('[');
putchar ('u');

printf ("%d "、currentSample);

// SCIA 8位字、波特率0x000F、默认值、1个停止位、无奇偶校验
void scia_init()

//注意:SCIA 外设的时钟被打开
//在 InitSysCtrl()函数中

SciaRegs.SCICCR.all =0x0007;// 1停止位,无回路
//无奇偶校验,8个字符位,
//异步模式,空闲线协议
SciaRegs.SCICTL1.all =0x0003;//启用 TX、RX、内部 SCICLK、
//禁用 RX ERR、睡眠、TXWAKE

SciaRegs.SCICTL2.bit.TXINTENA=1;
SciaRegs.SCICTL2.bit.RXBKINTENA=1;

SciaRegs.SCIHBAUD.all =0x0000;// 115200波特@LSPCLK = 22.5MHz (90MHz SYSCLK)。
SciaRegs.SCILBAUD.ALL =53;

SciaRegs.SCICTL1.all =0x0023;//从复位中撤回 SCI

返回;

int16_t 三角形(int t、int period){
t %=周期;
if (t < period / 2){
return (4095/3.3)*(2.5-4.0*t/期间);
}否则{
return (4095/3.3)*(-1.5 + 4.0*t/周期);


void main()

volatile int status = 0;


//@变量
uint16_t i;


volatile file *fid;

//如果从闪存运行,则只将 RAM 复制到 RAM
#ifdef _flash
memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);
#endif

//初始化系统控制:
// PLL、安全装置、启用外设时钟
//此示例函数位于 F2806x_SYSCTRL.c 文件中。
InitSysCtrl();


//@输出设置([blinky_cpu01]から)
InitGpio();
GPIO_SetupPinMux (OUTPIN、GPIO_MUX_CPU1、0);
GPIO_SetupPinOptions (OUTPIN、GPIO_OUTPUT、GPIO_PushPull);
GPIO_SetupPinMux (OUTPIN2、GPIO_MUX_CPU1、0);
GPIO_SetupPinOptions (OUTPIN2、GPIO_OUTPUT、GPIO_PushPull);


//对于这个示例、只初始化针对 SCI-A 端口的引脚。
EALLOW;
GpioCtrlRegs.GPCMUX2.bit.GPIO84 = 1;
GpioCtrlRegs.GPCMUX2.bit.GPIO85=1;
GpioCtrlRegs.GPCGMUX2.bit.GPIO84 = 1;
GpioCtrlRegs.GPCGMUX2.bit.GPIO85=1;
EDIS;

//清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
Dint;

//将 PIE 控制寄存器初始化为默认状态。
//默认状态为禁用所有 PIE 中断和标志
//被清除。
//此函数位于 F2806x_PIECTRL.c 文件中。
InitPieCtrl();

//禁用 CPU 中断并清除所有 CPU 中断标志:
IER = 0x0000;
IFR = 0x0000;

//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表,即使是中断也是如此
//在本例中未使用。 这对于调试很有用。
//可以在 F2806x_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 F2806x_PieVect.c 中找到
InitPieVectTable();

//初始化 SCIA
scia_init();

//初始化 LED 的 GPIO 并将其关闭
EALLOW;
GpioCtrlRegs.GPADIR.bit.GPIO12=1;
GpioCtrlRegs.GPADIR.bit.GPIO13 = 1;
GpioDataRegs.GPADAT.bit.GPIO12=1;
GpioDataRegs.GPADAT.bit.GPIO13=1;
EDIS;

//启用全局中断和更高优先级的实时调试事件:
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM


//配置 ADC:
//初始化 ADC
EALLOW;

//写入配置
AdcaRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4
AdcbRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4
AdcSetMode (ADC_ADCA、ADC_resolution_12位、ADC_SIGNALMODE_SINGLE);
AdcSetMode (ADC_ADCB、ADC_Resolution、12位、ADC_SIGNALMODE_SINGLE);

//将脉冲位置设置为晚期
AdcaRegs.ADCCTL1.bit.INTPULSEPOS=1;
AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1;

//为 ADC 加电
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;
AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1;


//延迟1ms 以允许 ADC 加电时间
DELAY_US (1000);


//ADCA
EALLOW;
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0x0E;//SOC0将转换引脚 ADCIN14
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 25;//采样窗口为 acqps + 1个 SYSCLK 周期
AdcaRegs.ADCSOC1CTL.bit.CHSEL = 0x0E;//SOC1将转换引脚 ADCIN14
AdcaRegs.ADCSOC1CTL.bit.ACQPS = 25;//采样窗口为 acqps + 1个 SYSCLK 周期

AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 1;// SOC1结束将设置 INT1标志
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 INT1标志
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除

//@ADconvert 引脚设置
AdcbRegs.ADCSOC0CTL.bit.CHSEL = 0x0F;//SOC0将转换引脚 ADCIN15 (十六进制)
AdcbRegs.ADCSOC0CTL.bit.ACQPS = 25;//采样窗口为 acqps + 1个 SYSCLK 周期
AdcbRegs.ADCSOC1CTL.bit.CHSEL = 0x0F;//SOC1将转换引脚 ADCIN15 (十六进制)
AdcbRegs.ADCSOC1CTL.bit.ACQPS = 25;//采样窗口为 acqps + 1个 SYSCLK 周期

AdcbRegs.ADCINTSEL1N2.bit.INT1SEL = 1;// SOC1的末尾将设置 INT1标志
AdcbRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 INT1标志
AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除



//将 STDOUT 重定向到 SCI
状态= add_device ("scia"、_ssa、SCI_open、SCI_close、SCI_read、 SCI_WRITE、SCI_LSEEK、SCI_unlink、SCI_rename);
FID = fopen ("scia"、"w");
freopen ("scia:"、"w"、stdout);
setvbuf (stdout、NULL、_IONBF、0);

//将 TI 标识打印到 STDOUT
drawTILogo();

//旋转 LED
GpioDataRegs.GPADAT.bit.GPIO12=0;
GpioDataRegs.GPADAT.bit.GPIO13=1;


对于(i = 0;i < 50;i++){
GpioDataRegs.GPATOGGLE.bit.GPIO12=1;
GpioDataRegs.GPATOGGLE.bit.GPIO13=1;
DELAY_US (50000);

//LED 关闭
GpioDataRegs.GPADAT.bit.GPIO12=1;
GpioDataRegs.GPADAT.bit.GPIO13=1;


//清除其中一个文本框,以便我们可以向其写入更多信息
clearTextBox();

//主程序循环-持续采样温度
/* for (;;){


//对 ADCIN14进行采样
currentSample = sampleadc ();

//更新串行终端输出
updateDisplay();

//如果样本高于中量程灯,则一个 LED
if (currentSample > 2048){
GpioDataRegs.GPADD.ALL = 0x2000;
}否则{
//以其他方式点亮另一个
GpioDataRegs.GPADD.ALL = 0x1000;

DELAY_US (1000000);

}*/


int n = 300;

对于(i = 1;i > 0;i++){
//比较 u
U =(4095/3.3)* cos (2 * pi*i/n)+ 4095*1.5/3.3;


if (u >三角形(i、n)){

GPIO_WritePin (OUTPIN、1);
}否则{
GPIO_WritePin (OUTPIN、0);

// printf ("%d "、GPIO_ReadPin (OUTPIN));

//比较 v
v =(4095/3.3)*cos (2*PI*i/n)+(2*PI/3)+4095*1.5/3.3;

if (v >三角形(i、n)){

GPIO_WritePin (OUTPIN2、1);
}否则{
GPIO_WritePin (OUTPIN2、0);



//比较 w
w = v + u;
if (i = 300){
I = 1;

//@输出 CSVfile
/*文件*fp;

fp = fopen ("../../adcdata.csv、"w");///workspace/program/debug 中的@相对路径名
if (fp == NULL){
printf ("ファイルが開けません\n");
返回-1;

fprintf (fp、"ch1、ch2\n");

对于(i = 0;i < 100;i++){
fprintf (fp、"%d\n"、out[i]);

fclose (FP);
*

因此,我可以获得 PWM 信号,但信号频率大约为2000[Hz]。

我想使信号频率超过200000k [Hz]。

当我参考数据表时、该 PIC 可以实现它。

请给我简单的建议,如何获得更高频率的信号?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我建议您使用 ePWM 示例代码。
    C:\ti\controlSUITE\device_support\F2837xS\V210\F2837xS_Examples_CPU1\ePWM_UP_AQ

    修改 TBPRD 值以获得所需的频率。

    此致、
    Gautam