Итак, вот моя настоящая проблема, мне нужно контролировать напряжение полевого транзистора с помощью ШИМ-контакта от ATMEGA32U4.Есть два сигнала.Один сигнал включает и выключает светодиод, включается на 1 мс (1 МГц) и выключается на 0,1 мс.Вторым сигналом является ШИМ, который я хочу, чтобы он имел частоту 50 кГц с разрешением 30 из этих импульсов в течение этого периода времени 50 кГц в течение времени включения 1 мс.Надеюсь, что это имеет смысл.AtMega работает с тактовой частотой 16 МГц.
Так что я использую два таймера, один таймер использует прерывания для управления светодиодом, а другой контролирует сигнал ШИМ, который поступает на FET.
Я быдействительно ценю помощь.
Я до сих пор придумал это.пожалуйста, ведите меня.
#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>
#include <avr/interrupt.h>
uint8_t tot_overflow;
void timer1_init()
{
TCCR1A |= (1 << CS01); // set up timer with prescaler = 8
TCNT1 = 0;
TIMSK1 |= (1 << TOIE1);
sei();
tot_overflow = 0;
}
ISR(TIMER1_OVF_vect)
{
tot_overflow++;
}
int main(void)
{
DDRD |= (1 << 0); //set Port D
timer1_init();
while(1)
{
if (tot_overflow >= 250)
{
PORTD ^= (1 << 0); // toggles the led
TCNT1 = 0; // reset the counter
tot_overflow = 0; // reset the overflow counter
}
}
}
void pwm_init()
{
DDRB = 1<<6; // Generate 30kHz PWM signal on PB6
TC4H = (319) >> 8; // Set TOP, write upper bits first.
OCR4B = (319) & 0xFF;
TCCR4A = (1<<COM4A1) | (1<<PWM4A);
TCCR4B = (1<<CS40); // Start timer
TC4H = (320) >> 8; // Set 100% duty cycle
OCR4A = (320) & 0xFF;
while(1)
{
}
}