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 可以实现它。
请给我简单的建议,如何获得更高频率的信号?