2017-07-19 88 views
0

我正在使用ATMEGA32和Crystal 16MHz
我已經寫下面的代碼來生成1kHz波。ATMEGA32熔絲位設置,低熔絲和高熔絲,16MHz,外部晶振?

我試着寫Low- 0xFFHigh-0x99
但我無法得到1kHz wave。我得到250Hz wave。而不是1kHz

請幫忙。

#define F_CPU 16000000UL 
#include <avr/io.h> //io related 
#include <util/delay.h> //delay 
#include "lcd.h" //custom lib for lcd 
#include <stdlib.h> //for string handling 
#ifndef sbit_h 
#define sbit_h 
int main(void) 
{ 

    //All Declarations Go here. 

    OCR0=p*127/100; //set pwm1 duty cycle 
    OCR2=OCR0;  //set pwm2 duty cycle (Output compare register) 

    while(1) 
    { 
     if ((bit_is_set(PIND, 3))) 
     { 
      pinChange(LED8,1); //Turn on solenoid valve 
      pinChange(LED1,1); 
      //PORTC|=(1<<PC3); 
      _delay_ms(sq); //wait for squeeze time 
      TCCR0 |= (1<<WGM00)|(1<<COM01)|(1<<WGM01)|(1<<CS01)|(1<<CS00); 
      //initialise timer in PWM mode 1kHz//cs00 and cs02 
      _delay_us(500);//90 degree phase shift 
      TCCR2 |= (1<<WGM20)|(1<<COM21)|(1<<WGM21)|(1<<CS22); //initialise timer2 in PWM mode 1kHz//CS22 for 1kHz 
      _delay_ms(w1); //wait until weld time over 
      TCCR0=0x00; //stop PWM1 
      TCCR2=0x00; //Stop PWM2 
      _delay_ms(h); //wait for hold time 
      pinChange(LED8,0); //turn off solenoid valve 
      pinChange(LED1,0); 
      TCNT0=0x00; //Reset timer counter 
      TCNT2=0x00; //reset timer counter 
    } 
} 
+1

也許,計時器使用分頻時鐘作爲輸入,您可以以某種方式配置除數。看看你的數據表。 –

+0

它與該套件隨附的以前的ATMEGA32芯片工作良好。 我從不費心檢查/更換熔絲位。 但是,那個由於某個問題而燒燬。所以我不得不買一個新的。代碼相同,電路相同。我相信它與熔絲位設置有關。 我參考數據表,並根據數據表將0xFF和0x99設置爲熔絲位。但不幸的是,問題仍然存在。 –

回答

0

您是否以正確的方式設置了時鐘選擇fuse bits(可能還有時鐘分頻器)?我會開始檢查CKSEL0...3CKDIV8

根據我的經驗,獲得期望的time/frequency的確切倍數幾乎總是基於錯誤的時鐘設置。

+0

我檢查並仔細檢查了CKSEL0 ... 3應該是1111 CKDIV8我檢查過了,它在模擬器上很好。 只是它在實際硬件中無法正常工作。 我以爲我的振盪器已經放棄了。我也更換了水晶。 –

+1

@AntarikshBahekar:您可以通過暫時使用內部8MHz振盪器(低熔絲0xE4)來縮小問題範圍,並檢查是否以這種方式得到(一半)預期頻率。你也可以每秒用一個_delay_ms(1000)來切換一個IO-Pin,並確認它真的是1。首先,讓你的時間基準正確,然後開始PWN的工作。 –

+0

@AntarikshBahekar:要驗證您是否正確設置時鐘源,可以斷開chrystal並檢查輸出信號。如果你仍然得到250Hz,微控制器運行在它的內部時鐘上。 – d10e