ATMEGA32熔丝位设置,低熔丝和高熔丝,16MHz,外部晶振?
我正在使用ATMEGA32
和Crystal 16MHz
。
我已经写下面的代码来生成1kHz
波。ATMEGA32熔丝位设置,低熔丝和高熔丝,16MHz,外部晶振?
我试着写Low- 0xFF
High-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
}
}
您是否以正确的方式设置了时钟选择fuse bits
(可能还有时钟分频器)?我会开始检查CKSEL0...3
和CKDIV8
。
根据我的经验,获得期望的time/frequency
的确切倍数几乎总是基于错误的时钟设置。
我检查并仔细检查了CKSEL0 ... 3应该是1111 CKDIV8我检查过了,它在模拟器上很好。 只是它在实际硬件中无法正常工作。 我以为我的振荡器已经放弃了。我也更换了水晶。 –
@AntarikshBahekar:您可以通过暂时使用内部8MHz振荡器(低熔丝0xE4)来缩小问题范围,并检查是否以这种方式得到(一半)预期频率。你也可以每秒用一个_delay_ms(1000)来切换一个IO-Pin,并确认它真的是1。首先,让你的时间基准正确,然后开始PWN的工作。 –
@AntarikshBahekar:要验证您是否正确设置时钟源,可以断开chrystal并检查输出信号。如果你仍然得到250Hz,微控制器运行在它的内部时钟上。 – d10e
也许,计时器使用分频时钟作为输入,您可以以某种方式配置除数。看看你的数据表。 –
它与该套件随附的以前的ATMEGA32芯片工作良好。 我从不费心检查/更换熔丝位。 但是,那个由于某个问题而烧毁。所以我不得不买一个新的。代码相同,电路相同。我相信它与熔丝位设置有关。 我参考数据表,并根据数据表将0xFF和0x99设置为熔丝位。但不幸的是,问题仍然存在。 –