Проблема с настройкой частоты ШИМ для Arduino Due

Я использую Arduino Due и установил разрешение аналогового чтения и записи на 12-битное для лучшего разрешения. В основном все, что я делаю, это изменяю рабочий цикл ШИМ, контролируя аналоговое входное напряжение постоянного тока от 0 до 3,3 В. Простой код в том виде, в каком он есть, теперь работает нормально:

int pwmPin9 = 9;      
int analogPin0 = 0;   
int val = 0;         


void setup() {

  Serial.begin(9600);

  pinMode(pwmPin9, OUTPUT);  // устанавливает пин как выход
  analogWriteResolution(12);
  analogReadResolution(12);

}

void loop() {

  val = analogRead(analogPin0);  // читаем входной пин
  Serial.println(val);
  analogWrite(pwmPin9, val); 

}

Моя проблема в том, что мне нужно установить частоту выхода ШИМ на 25 кГц или, по крайней мере, что-то ближайшее выше 25 кГц.

Я часами искал на форумах и не нашел решения. Здесь Я наткнулся на способ, но в моих папках нет библиотеки под названием variant.h. И этот код, если я включу его в свой скрипт, ничего не изменит. Какой может быть обходной путь для этого?

(Раньше я добивался этого через этот сайт, используя Arduino Uno, но для Due не смог найти никакого рабочего решения)

Редактировать: я нашел файл и внес следующие изменения в variant.h:

 * PWM
 */
#define PWM_INTERFACE       PWM
#define PWM_INTERFACE_ID    ID_PWM
#define PWM_FREQUENCY       20000
#define PWM_MAX_DUTY_CYCLE  4095
#define PWM_MIN_DUTY_CYCLE  0
#define PWM_RESOLUTION      12

/*
 * TC
 */
#define TC_INTERFACE        TC0
#define TC_INTERFACE_ID     ID_TC0
#define TC_FREQUENCY        20000
#define TC_MAX_DUTY_CYCLE   255
#define TC_MIN_DUTY_CYCLE   0
#define TC_RESOLUTION       8

Но это работает только для 20 кГц. Если я установил 25 кГц или 30 кГц, я не получаю никаких ошибок, но также не получаю никакого вывода :((

, 👍0


1 ответ


1

Есть несколько вещей, которые нужно сделать. Я успешно использовал это в прошлом со старыми проектами.

Кроме того, можно очень легко изменить настройки ШИМ на контактах с помощью esp32. Одной строкой кода является ledcSetup(PWM_Channel_Number, Frequency, Resolution) без каких-либо изменений. фактически погрузиться в изменение variant.h

Цитировать Керри Д. Вонг:

Если вы посмотрите на функцию PWMC_ConfigureClocks в файле pwmc.c, вы увидите, что самая высокая частота ШИМ может быть достигнута, так как вход функции составляет 42 МГц, потому что внутри функции она вызывает FindClockConfiguration, что, в свою очередь, гарантирует, что переданный параметр частоты меньше частоты MCK. Таким образом, для целочисленных делителей максимальная частота, которую мы можем передать, составляет 42 МГц (с делителем 2).

Чтобы достичь максимальной выходной частоты, мы можем использовать однобитный ШИМ, который по сути просто выводит прямоугольную волну с коэффициентом заполнения, равным единице. Затем мы можем установить предварительный делитель на 2, чтобы получить сигнал с частотой 84 МГц.

#include <Arduino.h>

uint32_t pwmPin = 8;
uint32_t maxDutyCount = 2;
uint32_t clkAFreq = 42000000ul;
uint32_t pwmFreq = 42000000ul; 

void setup() {
  pmc_enable_periph_clk(PWM_INTERFACE_ID);
  PWMC_ConfigureClocks(clkAFreq, 0, VARIANT_MCK);

  PIO_Configure(
    g_APinDescription[pwmPin].pPort,
    g_APinDescription[pwmPin].ulPinType,
    g_APinDescription[pwmPin].ulPin,
    g_APinDescription[pwmPin].ulPinConfiguration);

  uint32_t channel = g_APinDescription[pwmPin].ulPWMChannel;
  PWMC_ConfigureChannel(PWM_INTERFACE, channel , pwmFreq, 0, 0);
  PWMC_SetPeriod(PWM_INTERFACE, channel, maxDutyCount);
  PWMC_EnableChannel(PWM_INTERFACE, channel);
  PWMC_SetDutyCycle(PWM_INTERFACE, channel, 1);

  pmc_mck_set_prescaler(2);
}

void loop() 
{

Обратите внимание, что VARIANT_MCK определен в /arduino-1.5.7/hardware/arduino/sam/variants/arduino_due_x/variant.h как 84000000. PWM_INTERFACE_ID и PWM_INTERFACE определены в variant.h как ID_PWM и PWM, которые, в свою очередь, определены в /arduino-1.5.7/hardware/arduino/sam/system/CMSIS/Device/ATMEL/sam3xa/include/sam3x8e.h.

Итак, самая высокая стабильная частота, которую мы можем генерировать с помощью Arduino Due, составляет 84 МГц. На рисунках ниже показаны захваченные формы сигналов на разных частотах. Для сигнала с частотой 21 МГц pwmFreq устанавливается равным 21000000, предварительный делитель не используется. Для формы волны 42 МГц pwmFreq устанавливается на 420000 без предварительного делителя. Сигнал 84 МГц генерируется с параметром 42000000 и значением предварительного делителя 2.

Надеюсь, это поможет.

,

Вы читали, что я спрашивал? Мой вопрос: «Но это работает только для 20 кГц. Если я установлю 25 кГц или 30 кГц, я не получу никакой ошибки, но также не получу никакого вывода :(( «Это не устанавливает частоту ШИМ, 25 кГц., @user16307

Да, но, следуя описанным мною методам, вы должны получить желаемую настройку ШИМ... разве это не так? Можете ли вы установить любую другую частоту выше диапазона кГц? Или он просто разваливается на частоте выше 25 кГц?, @morbo

Нет, это не работает. А ваш ответ вообще не ответ. Я ищу решение, а не совет. Это вопрос о награде. Пожалуйста, удалите свой ответ, иначе мне придется удалить этот вопрос. Вы даже не используете Due, а пытаетесь ответить на такой конкретный технический вопрос об этом., @user16307

Если вам нужно решение вопроса «почему техническое решение не работает с моим оборудованием, у меня нет ошибок, за исключением того, что оно не работает, чтобы помочь в устранении неполадок», вам следует удалить этот вопрос и повторно задать полезную информацию, чем «это не работает! !!!!' :), @morbo

@ user16307, вы можете подождать другого ответа. если вы удалите вопрос, вы потеряете очки вознаграждения. этот ответ не получит очки вознаграждения без как минимум двух голосов., @Juraj