cn_x 发表于 2014-5-24 13:31:46

怎样优化能加快这段代码的执行效率(已解决)

本帖最后由 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:40

你这么多的浮点运算,能快得了吗

cn_x 发表于 2014-5-24 13:43:54

chenchaoting 发表于 2014-5-24 13:33
你这么多的浮点运算,能快得了吗

其他的倒还好办,大不了乘以一个基数作整型运算,比如说乘以1000,就是这个sin()计算貌似不怎么好办

cn_x 发表于 2014-5-24 13:46:02

或者我把sin()值做个表,直接查表?

canspider 发表于 2014-5-24 13:46:03

sin用cordic算法或是查表
自己搞个牛顿迭代也行

wangpengcheng 发表于 2014-5-24 14:11:40

用pic的单片机来砸场子啊?

skyxjh 发表于 2014-5-24 14:15:44

要快只能用查表输出

cn_x 发表于 2014-5-24 14:41:20

本帖最后由 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:42:06

cn_x 发表于 2014-5-24 14:41
现在只会用这个,Kinetis还在学习中,东西要保证完成,只能先用着PIC了

谢谢各位,现在用查表可以做到100HZ左右了,128次采样

zndz410 发表于 2014-5-24 19:44:15

cn_x 发表于 2014-5-24 14:42
谢谢各位,现在用查表可以做到100HZ左右了,128次采样

换个思路就不一样了。

zhiwei 发表于 2014-5-24 20:19:28

把正弦表弄细一点儿。用类似DDS的方法累加相位,然后查表。另外不要用浮点。

hzyyl2008 发表于 2014-5-24 21:40:46

可以试着把公式分解后提取固定值出来先算好,然后以常量的方式代入。
曾经用STC以16K载波产生SPWM,输出40-400Hz频率/幅值可调的正弦波。
页: [1]
查看完整版本: 怎样优化能加快这段代码的执行效率(已解决)