怎样优化能加快这段代码的执行效率(已解决)
本帖最后由 FSL_TICS_ZJJ 于 2014-5-25 22:06 编辑#defined S_Value//采样值
unsigned char i;
Amplitude = Adc_Amplitude(); //ADC读入幅值
// 幅值计算
unsinged int Amplitude_calculate(unsigned char i)
{
double a,b,c;
unsigned int Result;
a = (double)i /S_Value;
b = sin(2 * 3.14159 * a);
c = (double)(Amplitude * b);
Result = (WORD)c + 2048;
return Result;
}
//输出正弦波
for(i = 0; i <S_Value;i++)
{
DAC_SET(1, Amplitude_calculate(i);
}
以上代码是用DAC来拟合输出正弦波,幅值可以通过外部旋钮调整,使用这段代码的调整幅值输出正弦波的功能可以实现,但是如果采样次数多的话输出频率上不去
目前使用的是PIC18F45K80单片机,使用外部16MHZ晶振,4倍频之后是64MHZ系统时钟,采样值取128的话,正弦波频率只有几个HZ,现在要实现40HZ左右的输出,采样值i就只能取16了
求教怎样做才能使执行效率更高在高采样值的前提下(比如说128),输出40HZ的正弦波 你这么多的浮点运算,能快得了吗 chenchaoting 发表于 2014-5-24 13:33
你这么多的浮点运算,能快得了吗
其他的倒还好办,大不了乘以一个基数作整型运算,比如说乘以1000,就是这个sin()计算貌似不怎么好办 或者我把sin()值做个表,直接查表? sin用cordic算法或是查表
自己搞个牛顿迭代也行 用pic的单片机来砸场子啊? 要快只能用查表输出 本帖最后由 cn_x 于 2014-5-24 14:44 编辑
wangpengcheng 发表于 2014-5-24 14:11
用pic的单片机来砸场子啊?
现在只会用这个,Kinetis还在学习中,东西要保证完成,只能先用着PIC了
弄完这个,整个K60板子来玩,手上的K20资源不够
kinetis有没有DAC比较多的型号? 貌似都是两个通道来着 cn_x 发表于 2014-5-24 14:41
现在只会用这个,Kinetis还在学习中,东西要保证完成,只能先用着PIC了
谢谢各位,现在用查表可以做到100HZ左右了,128次采样 cn_x 发表于 2014-5-24 14:42
谢谢各位,现在用查表可以做到100HZ左右了,128次采样
换个思路就不一样了。 把正弦表弄细一点儿。用类似DDS的方法累加相位,然后查表。另外不要用浮点。 可以试着把公式分解后提取固定值出来先算好,然后以常量的方式代入。
曾经用STC以16K载波产生SPWM,输出40-400Hz频率/幅值可调的正弦波。
页:
[1]