【原创】用TI DSP实现一个三角波发生器
0赞在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;
}