Part Number:TMS320F28335Other Parts Discussed in Thread:CONTROLSUITE
2833x_SGENT1例子中的代码如下
// ===================================================================================== // This software is licensed for use with Texas Instruments C28x // family DSCs. This license was provided to you prior to installing // the software. You may review this license by consulting a copy of // the agreement in the doc directory of this library. // ------------------------------------------------------------------------------------- //Copyright (C) 2010-2011 Texas Instruments, Incorporated. //All Rights Reserved. //====================================================================================== /* ============================================================================== System Name:Signal Generator Module demo File Name:SGENT1.C Description:Primary System file for demonstrating the Signal Generator module Originator:Digital control systems Group - Texas Instruments Target dependency: C28x Description: ============The "C" frame work, for demonstrating the signal generator module is given below________________________|||||| X1=OUT |EVMDAC|| SGENT_1 |-------->|DLOG_4CH ||||PWMDAC||___________||_____________| */ //###################################################################################### // $TI Release: C28x SGEN Library Version v1.01 $ // $Release Date: September 30, 2011 $ //###################################################################################### #include "DSP28x_Project.h"// Device Headerfile and Examples Include File #include <sgen.h> #define SIGNAL_LENGTH 512 /* Create an instance of Signal generator module*/ SGENT_1 sgen = SGENT_1_DEFAULTS; #pragma DATA_SECTION(ipcb, "SGENipcb"); int ipcb[SIGNAL_LENGTH]; int xn,yn; void main() {unsigned long i;InitSysCtrl();DINT;InitPieCtrl();IER = 0x0000;IFR = 0x0000;InitPieVectTable();EINT;// Enable Global interrupt INTMERTM;// Enable Global realtime interrupt DBGM /* Signal Generator module initialisation*/ sgen.offset=0; sgen.gain=0x7fff; /* gain=1 in Q15 */ sgen.freq=5369; /* freq = (Required Freq/Max Freq)*2^15 */ /* = (50/305.17)*2^15 = 5369 */ sgen.step_max=1000; /* Max Freq= (step_max * sampling freq)/65536 */ sgen.alpha=8192;/* phase_norm =(pi/4/(2*pi))*2^16=8192*/ /* So call step_max is normalized fmax in Q16 format*/ /* step_max=fmax/fs*65536*/ /* f/fmax*2^15=freq */for(i=0;i<SIGNAL_LENGTH;i++){ ipcb[i]=0;}for(i=0;i<SIGNAL_LENGTH;i++){ sgen.calc(&sgen); xn=sgen.out; ipcb[i]=xn;} for(;;); } /* End: main() */
这部分代码请解释一下,谢谢!
/* Signal Generator module initialisation */ sgen.offset=0;
sgen.gain=0x7fff; /* gain=1 in Q15 */
sgen.freq=5369; /* freq = (Required Freq/Max Freq)*2^15 */
/* = (50/305.17)*2^15 = 5369 */
sgen.step_max=1000; /* Max Freq= (step_max * sampling freq)/65536 */
sgen.alpha=8192; /* phase_norm =(pi/4/(2*pi))*2^16=8192 */
/* So call step_max is normalized fmax in Q16 format */
/* step_max=fmax/fs*65536 */
/* f/fmax*2^15=freq
另外关于这个算法的文章是英文版本我也看不懂 请指点,Signal Generator Library.pdf 谢谢!
Cherry Zhou:
您好我们已收到您的问题并升级到英文论坛,因感恩节假期,预计答复您的时间将稍晚。敬请谅解!
,
jun liu:
谢谢您的解答!
,
Cherry Zhou:
您好,请您参阅以下文档:
controlSUITE\libs\DSP\SGEN\V101\doc\ 第 11 页介绍了 SGENT_1 函数还有其input和output。
,
jun liu:
这个文档我早都提到过的 关键是英文 以前这个问题你让我英文论坛提问 我都说了邮箱无法更改还有英文水平有限 麻烦您给翻译或者解释一下 谢谢
,
Cherry Zhou:
好的,您稍等,我看下帮您翻译一下哈。
,
jun liu:
谢谢 实在是不好意思 我这英文水平有限
,
Cherry Zhou:
您好,您可以直接圈出来或者po一下您具体哪里看不太懂吗?这样我可以直接帮您翻译。谢谢!
,
jun liu:
我是一点都看不懂 就想弄明白怎么生成正弦波就可以 谢谢
,
Cherry Zhou:
您好,非常抱歉,目前该文档只有英文版本,如果查阅有困难,我们建议您可以借助翻译软件来提供帮助。如果您在查阅后仍有技术问题,请随时联系我。敬请谅解!
,
jun liu:
麻烦解释一下这个例子是怎么生成正弦波?采用什么算法?sgen.calc函数体部分在哪里?我想看到这个函数具体是怎么实现的?
/* Signal Generator module initialisation */ sgen.offset=0; sgen.gain=0x7fff; /* gain=1 in Q15 */ sgen.freq=5369; /* freq = (Required Freq/Max Freq)*2^15 */ /* = (50/305.17)*2^15 = 5369 */ sgen.step_max=1000; /* Max Freq= (step_max * sampling freq)/65536 */ sgen.alpha=8192; /* phase_norm =(pi/4/(2*pi))*2^16=8192 */ /* So call step_max is normalized fmax in Q16 format */ /* step_max=fmax/fs*65536 */ /* f/fmax*2^15=freq */
for(i=0;i<SIGNAL_LENGTH;i++) { ipcb[i]=0; }
for(i=0;i<SIGNAL_LENGTH;i++) { sgen.calc(&sgen); xn=sgen.out; ipcb[i]=xn; }
,
Cherry Zhou:
好的已帮您跟进给工程师,有新的消息会尽快给到您。
,
jun liu:
好的 谢谢
,
Cherry Zhou:
jun liu 说:这个例子是怎么生成正弦波?
假设调用速率为 20kHz,该例子会返回一个 Q15 值,该值与 50Hz 正弦波相对应。for loop的操作是使用这些lookup值预先填充array,这样当调用 ISR 时,它可以通过 ipcb[] 数组递增,而不用实时调用 sgen 函数。该示例在之前提到的文档的第13页有。
此liabrary中还有增加的分辨率函数,这些函数将lookup table和 interpolation组合在一起。
jun liu 说:采用什么算法
这些函数使用基准正弦查找表( sine lookup table)与模数算术(modulo arithmetic)相组合,形成差频正弦波。这样 SW 能够灵活地创建特定的正弦波,而不用存储specific特定正弦波的lookup table。
在典型环境下,假设只使用一个设定的频率,ipcb array会被硬编码到器件中。
jun liu 说:sgen.calc函数体部分在哪里?
如果您使用的是 controlSUITE 中包含的example,那sgen calcs 位于地址 0xEC00 开始。 正弦表从 0xFC00 开始加载。
jun liu 说:我想看到这个函数具体是怎么实现的?
这取决于系统的需求。 如果希望创建特定频率的输出信号,那么 ipcb[] 中存储的值将以 ISR 速率反馈发送到 DAC。
同时,在创建AC电压波形时,会用到inverters等应用(在该处系统需要匹配grid frequency–考虑到 C2000 应用的作用,可能是产生该频率的原因)–)。 请注意, sine generator有双相和三相版本 (120 度分离)。
,
jun liu:
谢谢您的答复 这个回复太专业了 十分感谢
,
jun liu:
谢谢