工具/软件:Code Composer Studio
尊敬的 TI 社区:
我要在项目中使用 SGEN 库创建可扫描频率发生器、这是一个障碍。 我的上限是100kHz、无法输出干净的正弦输出。 图1显示了100kHz 时正弦输出的外观。 此项目的引用是 buffdac_sine_cpu01。
还有另一个使用 DMA 的正弦发生器示例 buffdac_sine_dma_cpu01。 我能够 使用 DMA 生成平滑的100kHz 正弦波、但我不使用它、因为我希望能够手动扫描频率。 我可以使用 SGEN 库在运行时修改 sgen.freq 值来实现这一点。
在 TI 的信号发生器库模块用户指南中、它逐步介绍了如何生成特定频率输出。 我在1.8MHz 的采样频率下使用 CPU Timer0 ISR。 CPU 定时器0触发的采样频率越高、输出信号就越平滑。 参数 sgen.gain 和 sgen.offset 分别设置为0x7FFF 和0。 这会将增益设置为1、不会添加偏移。 接下来、我计算 sgen.step_max 和 sgen.freq。
该步骤定义为:
其中 F_max 是程序的最大频率(100kHz)、F_ISR 是 ISR 的频率(1.8MHz)。 我计算的步进值为 238、609、294。
最后、我所需的频率为100kHz、要计算 sgen.freq、我执行以下操作:
其中 f 是所需的100kHz 频率、f_max 是100kHz。 结果为2^31或2、147、483、648。
运行该代码后、输出如下面的图1所示。
我尝试通过将其增加到2MHz 来改进采样、新计算的步长值 为214、748、365。 这会导致较低输出频率(90kHz)的正弦波形、如图2所示。 我认为这是由于 DAC 输出的限制而发生的。
是否有办法改进此 SGEN 代码以获得平滑正弦输出、或者是否受到库的限制? 非常感谢您的参与。
//包含的文件 #include "F28x_Project.h" #include "sgen.h" //信号生成头文件 volatile struct dac_regs* dac_ptr[4]={0x0、DacaRegs、DacbRegs、& DaccRegs}; SGENHP_1 sgen = SGENHP_1_num; uint32 samplplingFreq_Hz = 1800000; uint16 sisr sude_freedums = 0 ;void voltaturedac = 0_float = 0_id_float;void voltatureid_float = 0_float 0_id_id_id_id_float = 0;uatureid_float 0_id_id_id_id_float = 0_id_id_id_float = 0_id_float 0_id_ // CPU 定时器0中断服务例程 //主 void main (void) { //初始化系统控制: InitSysCtrl(); //禁用 CPU 中断 Dint; //将 PIE 控制寄存器初始化为默认状态。 InitPieCtrl(); //清除所有中断并初始化 PIE 矢量表: IER = 0x0000; IFR = 0x0000; InitPieVectTable(); //将 CPU Timer0和 ADCA1中断函数映射到 PIE 矢量表 EALLOW; PieVectTable.TIMER0_INT =&CPU_timer0_ISR; EDIS; //初始化变量 cpuPeriod_us =(1.0/200); samplingPeriod_us =(1000000.0/samplingFreq_Hz); //配置 DAC configureDAC (2); //配置 SGEN sgen.alpha = 0; //范围(16)= 0x0000 -> 0xFFFF sgen.offset = 0x0; //范围(Q15)= 0x8000 -> 0x7FFF Sgen.gain = 0x7FFF;//范围(Q15)= 0x0000 -> 0x7FFF sgen.step_max = 238609294; sgen.freq = 2147483648; //初始化 CPU 定时器 InitCpuTimer(); //将 CPU Timer0配置为以指定的采样频率中断 ConfigCpuTimer (&CpuTimer0、200、1000000.0/samplingFreq_Hz); //启动 CPU Timer0 CpuTimer0Regs.TCR.ALL = 0x4000; //启用中断 IER |= M_INT1; PieCtrlRegs.PIEIER1.bit.INTx7=1; EINT; ERTM; while (1){} // configureDAC -启用并配置请求的 DAC 模块 void configureDAC (uint16 DAC_num) { EALLOW; DAC_PTR[DAC_num]->DACCTL.bit.DACREFSEL = 1; DAC_PTR[DAC_num]->DACOUTEN 位.DACOUTEN = 1; DAC_PTR[DAC_num]->DACVALS.ALL = 0; DELAY_US (10);//缓冲 DAC 加电延迟 EDIS; } // cpu_timer0_isr -将正弦值写入 DAC 的计时器 ISR,记录正弦 // 计算下一个正弦值、并计算中断 // 持续 时间中断 void cpu_timer0_isr (void) { //启动 CPU 定时器1以指示中断开始 CpuTimer1Regs.TCR.ALL = 0x0000; //将当前正弦值写入缓冲 DAC DAC_PTR[2]->DACVALS.all = sgen_out; //计算下一个正弦值 sgen.calc(&sgen); //缩放下一个正弦值 sgen_out =(sgen.out + 32768)>> 4; //确认此中断以从组1接收更多中断 PieCtrlRegs.PIEACX.ALL = PIEACK_Group1; //停止 CPU 定时器1以指示中断结束 CpuTimer1Regs.TCR.ALL = 0x0010; //重新加载 CPU 定时器1 CpuTimer1Regs.TCR.ALL = 0x0030; }
图1.
图2.


