常规DAC输出采用定时器触发,其中定时器涉及相关参数有:psc(Prescaler预分频值)与arr(预装载值),DAC相关的参数有point(采样点数),主频170000000Hz
V1.0算法
预设psc=0,point=1024, 根据频率(fre)调节arr参数进行频率调节
psc=0;
point=1024;
arr=170000000/fre/(psc+1)/point;
存在问题:
1.采样数确定,需要的频率高时arr为0,失去频率调制功能
2.因整数整除效果,最终产生效果与预设存在误差
验证效果:
V2.0算法
预设psc=0, 根据频率(fre)调节arr参数与point参数进行频率调节
psc=0;
int pointR[5]={1024,512,256,128,64};
point=pointR[(int)log10(fre/100)];
arr=170000000/fre/(psc+1)/point;
改进方向:
1.根据频率调整采样点数point
验证效果:
V3.0算法
预设psc=0, 根据频率(fre)调节arr参数与point参数进行频率调节(反馈法)
psc=0;
point=4096;
DELTA=0.005;
arr=170000000/fre/(psc+1)/point;
while(fabsf((1.0f*170000000/(arr+1)/(psc+1)/point)-(1.0f*fre))>DELTA*fre)
{
point--;
arr=(170000000)/fre/(psc+1)/point-1;
}
改进方向:
1.根据频率调整采样点数point
2.根据最终产生效果与预设的误差进行反馈调节
验证效果:
参考例程: