Синусоида с помощью Arduino Uno
Я увлекаюсь адруино, хочу сделать синусоиду с помощью arduino uno, для этого я использую timer0 в качестве прерывания, OCR0A установлен на 17 для прерывания 3,6 кГц (16000000/(100 Гц * интервал 36)/256-1), Если я использую только один вывод ШИМ, я получаю правильную частоту, но когда я включаю два контакта ШИМ, я получаю только половину частоты, пожалуйста, сообщите, что не так и как это исправить. ................................. Этот код показывает правильную частоту на выводе 9 ШИМ.
//
ISR(TIMER0_COMPA_vect)
{
OCR1A=(256+((((sin(num*3.14/180))*256))))/2;
//OCR1B=(256+((((sin(num*3.14/180))*256))))/2;
num=num+10;
if(num >= 360)
{
num = 0;
}
}
// ............................ В этом коде я получаю только половину предыдущей частоты на выводах ШИМ 9,10
//
ISR(TIMER0_COMPA_vect)
{
OCR1A=(256+((((sin(num*3.14/180))*256))))/2;
OCR1B=(256+((((sin(num*3.14/180))*256))))/2;
num=num+10;
if(num >= 360)
{
num = 0;
}
}
//
@anoop, 👍0
Обсуждение1 ответ
Вы выполняете сложные вычисления внутри процедуры обслуживания прерываний. Это не очень хорошая идея. Вычисление синусов занимает много времени, так как состоит из множества сложных операций с плавающей запятой. Процедуры обслуживания прерываний должны быть короткими и максимально простыми.
Вероятно, это причина того, что вы не можете одновременно активировать два ШИМ-сигнала на одной частоте. ISR просто занимают слишком много времени.
Решением может быть предварительный расчет нужных сигналов или значительное упрощение расчетов сигналов (предпочтительно без плавающей запятой). Если вы решите выполнить предварительный расчет, позаботьтесь о том, чтобы не выходить за пределы ограниченного объема памяти, доступной на вашем Arduino. Вы можете свести к минимуму объем используемой памяти, вычислив и сохранив только 1/4 полного сигнала, а оставшиеся 3/4 сконструировав из этих значений.
Это оставляет преобразование вашего выхода ШИМ в настоящую синусоиду. Как вы планируете это сделать?
Если таблица становится слишком битой (использует слишком много оперативной памяти), вы можете использовать PROGMEM, чтобы сохранить таблицу во флэш-памяти., @Gerben
справочная таблица должна хранить только 1/4 синусоиды, @jsotola
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
1. Как вы настроили свой таймер? 2. Функция sin() занимает около 100 мкс на вызов., @Edgar Bonet
Вы можете использовать
OCR1B=OCR1A
, так как оба они одинаковы. Но, предполагая, что проблема, как сказал StarCat, связана с тем, что ISR занимает много времени, я бы рассмотрел создание таблицы значений SIN., @GerbenЛучшим методом было бы сгенерировать простую прямоугольную волну, а затем отфильтровать ее в синусоидальную волну. Не нужно возиться со сложными вычислениями или даже таблицами поиска., @Majenko