打印

用单片机输出正弦波的算法程序

[复制链接]
2798|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gxgclg|  楼主 | 2011-8-17 09:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
yoyowodeai| | 2011-8-17 21:36 | 只看该作者
用单片机做这个,难为了

使用特权

评论回复
板凳
丑奴儿atl| | 2011-8-18 08:53 | 只看该作者
void main(void)
{
    unsigned char counter;
    unsigned char i;
    /*High speed internal clock prescaler: 1*/
    CLK_CKDIVR = 0x00;
   
    _asm("sim");

    /* Time Base configuration */
    TIM1_PSCRH  = 0x00;    /* Configuration prescaler (Fck_cnt=Fck_psc/PSCR+1)*/
    TIM1_PSCRL  = 0x00;    /* 00: Fck_cnt=Fck_psc */
    TIM1_CR1   &= 0xEF;    /* Counter mode up: Bit4(DIR): 0_UP,1_Down */
    TIM1_ARRH   = 0x00;    /* PWM period */
    #if  Freq_100Hz
      TIM1_ARRL = 0x72;
    #else
      TIM1_ARRL = 0xE3;
    #endif
    TIM1_RCR    = 0x00;    /* Counter repetition. */

    /* Channel 1, 2 and 3 Configuration in PWM mode */
    TIM1_CCMR1 |= 0x60;    /* CC1 output mode: PWM mode 1.  */
    TIM1_CCMR2 |= 0x60;    /* CC2 output mode: PWM mode 1.  */
    TIM1_CCMR3 |= 0x60;    /* CC3 output mode: PWM mode 1.  */
    TIM1_CCER1  = 0x11;    /* OC enabled. */
    TIM1_CCER2  = 0x01;   
  
    TIM1_OISR  |= 0x00;    /* Idle state set  */

    TIM1_CCR1H  = 0x00;    /* CC1 Dutycycle */
    TIM1_CCR1L  = 0x39;
    TIM1_CCR2H  = 0x00;    /* CC2 Dutycycle */
    TIM1_CCR2L  = 0x39;
    TIM1_CCR3H  = 0x00;    /* CC3 Dutycycle */
    TIM1_CCR3L  = 0x39;
    TIM1_IER    = 0x01;    /* Enable TIM1 update interrupt. */
    TIM1_CR2   &=~0x01;    /* disable Capture/Compare Preloaded Control. */

    /* Automatic Output enable, Break, dead time and lock configuration*/
    TIM1_BKR   |= 0x48;   
    TIM1_DTR    = 0x04;    /* Dead time (1s/16MHz)*2*4 = 500ns */
    TIM1_BKR   |= 0x10;    /* Break enable */
    TIM1_BKR   |= 0x20;    /* Break polarity High */
    TIM1_BKR   |= 0x40;    /* Automatic output enable */
    TIM1_BKR   |= 0x01;    /* LockLevel_1 */

    /* Main Output Enable */
    TIM1_BKR   |= 0x80;    /* Output enable */

    for(i=0; i<100; i++)
    {
     #if Freq_100Hz
       pwm_duty[i]=(unsigned int)(55+(float)55*sin(2*3.1415926*(float)i*0.2/(float)20));
     #else
       pwm_duty[i]=(unsigned int)(110+(float)110*sin(2*3.1415926*(float)i*0.2/(float)20));
     #endif
    }

    /* TIM1 counter enable */
    TIM1_CR1   |= 0x01;  /* Counter enable */
    TIM1_EGR   |= 0x01;

    _asm("rim");

    counter = 0;
    while(1);
}
- -

使用特权

评论回复
地板
delin17| | 2011-8-18 12:30 | 只看该作者
用VC建立正弦波整个周期的数组?然后查表,用DAC输出查表对应电压。

使用特权

评论回复
5
young_xyj| | 2011-8-18 15:06 | 只看该作者
单片机有DA的多吗?

使用特权

评论回复
6
火箭球迷| | 2011-8-18 21:43 | 只看该作者
这个用单片机实现起来也不难

使用特权

评论回复
7
suse-lj| | 2011-10-21 12:00 | 只看该作者
仅仅弄个正弦波出来看看 到是不难。联系其他的,就难说了

使用特权

评论回复
8
627878985| | 2013-8-9 13:38 | 只看该作者
哪位大神用过AD768来产生正弦波?求讲解

使用特权

评论回复
9
Regsen| | 2013-8-13 21:35 | 只看该作者
没做过。呵呵,求大神

使用特权

评论回复
10
shenmu2012| | 2013-8-18 23:38 | 只看该作者
仅仅利用正弦波的话是非常容易的,利用查表发来实现的就Ok啦

使用特权

评论回复
11
shenmu2012| | 2013-8-18 23:39 | 只看该作者
具体的也就是利用查表法周期性的将正弦波的对应的数字值的输入到DA模块中即可

使用特权

评论回复
12
firstblood| | 2013-8-19 21:52 | 只看该作者
也看了下楼上的一些意见的,这个是不算复杂的啊

使用特权

评论回复
13
angerbird| | 2013-8-23 00:00 | 只看该作者
这个算法的到没见到过的,不过大致上我还是知道的

使用特权

评论回复
14
angerbird| | 2013-8-23 00:01 | 只看该作者
一般都是用查表法的直接来输出所对应的正弦波的幅值的

使用特权

评论回复
15
angerbird| | 2013-8-23 00:02 | 只看该作者
这样的话只不过存在一个精度的问题的,需要注意的

使用特权

评论回复
16
gxgclg|  楼主 | 2013-8-24 10:28 | 只看该作者
可以自己试试

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

177

主题

1653

帖子

1

粉丝