2017-07-19 49 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