日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

PWM生成正弦波的頻率可變的程序

 ylw527 2010-09-15
 
// Target : M32 
// Crystal: 4.0000Mhz 

#include <iom32.h> 
#include <ina90.h>

#include "delay.h"
//#include <ioavr.h>                     // Use IAR-AVR library

#define uchar unsigned char 
#define uint unsigned int
#define   N     98


// 正弦波樣本表 
__flash unsigned char auc_sinparam[N] = { 
  
    128,136,144,152,160,168,175,183,190,197,204,210,216,222,227,232,
237,241,244,247,250,252,253,254,255,255,254,253,252,250,247,244,
241,237,232,227,222,216,210,204,197,190,183,175,168,160,152,144,
136,128,119,111,103,95,87,80,72,65,58,51,45,39,33,28,
23,18,14,11,8,5,3,2,1,0,0,1,2,3,5,8,
11,14,18,23,28,33,39,45,51,58,65,72,80,87,95,103,
111,119
}; 

unsigned int  x_sw=1; 
unsigned int  indexU=0;  
unsigned int  indexV=N/3;  
unsigned int  indexW=2*N/3;


//timer0溢出中斷
#pragma vector=TIMER0_OVF_vect 
__interrupt void timer0_ovf_isr(void) 
{  
    
    indexU+=x_sw;   
    if(indexU>(N-1))   indexU-=N;   
    OCR0  = auc_sinparam[indexU];
    
    indexV+=x_sw;
    if(indexV>(N-1))   indexV-=N;
    OCR1A = auc_sinparam[indexV];
    
    indexW+=x_sw;
    if(indexW>(N-1))   indexW-=N;
    OCR1B = auc_sinparam[indexW];



  
void system_init (void)
{
    //port init
    PORTB=0xf7;   
    DDRB=0xff; //PB3--OC0
    
    PORTD=0xff;//pd0-pd3 pull-up enable for key1-key4
    DDRD=0x30;//PD4--OC1A,PD5--0C1B
    
    //timer0 init   
    TCCR0=0x00;   
    OCR0=0xff; //初始值占空比為0
    TCCR0=0x62;//相位修正  8分頻  正向輸出  啟動定時器
    
    //time1 init
    TCCR1A= 0x00;
    OCR1A = 0xff;//正向輸出
    OCR1B = 0xff;//正向輸出
    //ICR1  = 0xff;
    TCCR1A= 0xa1;
    TCCR1B= 0x02;//相位修正 8分頻   啟動定時器
    
    indexU=0;  
    indexV=N/3;  
    indexW=2*N/3; 
      
    TIMSK=0x01;//time0 over interrupt
    __enable_interrupt(); //re-enable interrupts
}


void main(void) 

    uchar tem,key;
    system_init();//系統(tǒng)初始化
    while(1) 
    {
        tem=0x0f&PIND;       //讀取端口b
        if(tem!=0x0f)   //判斷是否有按鍵按下
        {
  //s_ms(50);   //排除按鍵抖動和抗干擾
  delay_nms(35);
          key=0x0f&PIND;
  if(key==tem)
  {
            x_sw++;
            if(x_sw==6) x_sw=1;
            if(x_sw==1) //fsin=10hz
            {
              PORTB=(1<<PB6)|(1<<PB5)|(1<<PB4)|(1<<PB2)|(1<<PB1)|(1<<PB0);
              PORTB&=~(1<<PB7);
            }
            if(x_sw==2)//fsin=20hz 
            {
              PORTB=(1<<PB7)|(1<<PB5)|(1<<PB4)|(1<<PB2)|(1<<PB1)|(1<<PB0);
              PORTB&=~(1<<PB6);
            }
            if(x_sw==3)//fsin=30hz 
            {
              PORTB=(1<<PB7)|(1<<PB6)|(1<<PB4)|(1<<PB2)|(1<<PB1)|(1<<PB0);
              PORTB&=~(1<<PB5);
            }
            if(x_sw==4)//fsin=40hz 
            {
              PORTB=(1<<PB7)|(1<<PB6)|(1<<PB5)|(1<<PB2)|(1<<PB1)|(1<<PB0);
              PORTB&=~(1<<PB4);
            }
            if(x_sw==5)//fsin=50hz 
            {
              PORTB=(1<<PB7)|(1<<PB6)|(1<<PB5)|(1<<PB4)|(1<<PB1)|(1<<PB0);
              PORTB&=~(1<<PB2);
            }
            //PORTB=0x0f|(key<<4);  //端口D輸出按鍵值
          }
}
        //speed_switch();//按鍵調(diào)速
    }


上面的程序有兩個錯誤:、
1、用示波器看到的正弦波頻率不是20hz,40hz,60hz,80hz,100hz,而是10hz,20hz,30hz,40hz,50hz,請問是為什么

2、用示波器觀察發(fā)現(xiàn):隨正弦波頻率增大,正弦波幅值會越來越小,請問是為什么

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多