paradoxfx

【原创】用TI DSP实现一个三角波发生器

0
阅读(5922)

在DSP的程序开发中,有时候需要用到一些类似三角波形状的测试信号。其实现的最基本的思想就是,定义一个初值,然后每次累加一个增量(增计数形式的三角波)或者每次递减一个增量(减计数形式的三角波),也可以在达到最大值时翻转,则为等腰三角波形状。用公式来表达,即

Angle = Angle + StepAngleMax × Freq

在给定的步长下,输出三角波信号的频率为:

其中,fs表示采样频率;以常用的PWM模块T1PR定时器下溢中断在定时中断启动的采样为例,采样频率就是中断频率。m表示量化的分辨率,例如用16位定点数表示时,m为16;用IQ格式表示时,m就说Q值;用c28x FPU支持的单精度浮点表示时,m为32.

为了将程序模块化以便于后续程序的调用,并保证一定的精度,这里需要将整个三角波信号封装起来,和前面几篇博文中提到的一样,封装后包括头文件、源程序以及在主程序中的例化、调用。

再说明一下结构体的定义格式:

typedef struct { _iq Freq; // Input: Ramp frequency

_iq StepAngleMax; // Parameter: Maximum step angle

_iq Angle; // Variable: Step angle

_iq Gain; // Input: Ramp gain

_iq Out; // Output: Ramp signal

_iq Offset; // Input: Ramp offset

void (*calc)(); // Pointer to calculation function

} RAMPGEN;

typedef RAMPGEN *RAMPGEN_handle;

 

……省略例化过程……

 

在主程序中需要定义输入输出的值,即

rg1.Freq = freq1; // Pass inputs to rg1

rg1.Gain = gain1; // Pass inputs to rg1

rg1.Offset = offset1; // Pass inputs to rg1

       增益gain即三角波信号的幅值,而偏移量offset则相当于三角波信号的初始值了。

 

在封装后的主程序中,主要就是前面那个公式的实现过程了,以TMS320F28335为例,有

void rampgen_calc(RAMPGEN *v)

{    

        v->Angle += v->StepAngleMax*v->Freq;      

        if (v->Angle>1.0)

          v->Angle -= 1.0;

        else if (v->Angle<-1.0)

          v->Angle += 1.0;

       v->Out = v->Angle*v->Gain + v->Offset;

 

       if (v->Out>1.0)

          v->Out -= 1.0;

        else if (v->Out<-1.0)

          v->Out += 1.0;

 

}