Here is a code snippet:
Code: Select all
#define RMT_TX_CHANNEL (rmt_channel_t)1 /* RMT channel for transmitter */
#define RMT_TX_GPIO_NUM PIN_PWM /* GPIO number for transmitter signal */
#define RMT_TX_CARRIER_DISABLE 0 /* Disable carrier */
#define RMT_CLK_DIV 80 /* RMT counter clock divider */
#define rmt_item32_tIMEOUT_US 9500 /*!< RMT receiver timeout value(us) */
#define RMT_TICK_10_US (80000000/RMT_CLK_DIV/100000) /* RMT counter value for 10 us.(Source clock is APB clock) */
#define ITEM_DURATION(d) (d*10.0/RMT_TICK_10_US)
#define PIN_PWM (gpio_num_t)(your pin #)
//initialize RMT
rmt_config_t rmt_tx;
rmt_tx.channel = RMT_TX_CHANNEL;
rmt_tx.mem_block_num = 1;
rmt_tx.clk_div = RMT_CLK_DIV;
rmt_tx.gpio_num = PIN_PWM;
rmt_tx.tx_config.loop_en = true;
rmt_tx.tx_config.carrier_duty_percent = 50;
rmt_tx.tx_config.carrier_freq_hz = 600;
rmt_tx.tx_config.carrier_level = (rmt_carrier_level_t)0;
rmt_tx.tx_config.carrier_en = 1;//RMT_TX_CARRIER_DISABLE;
rmt_tx.tx_config.idle_level = (rmt_idle_level_t)0;
rmt_tx.tx_config.idle_output_en = true;
rmt_tx.rmt_mode = RMT_MODE_TX;
rmt_config(&rmt_tx);
rmt_driver_install(rmt_tx.channel, 0, 0);
rmt_item32_t item;
item.level0 = 10;
item.duration0 = 1;
item.level1 = 10;
item.duration1 = 1;
rmt_tx_start(RMT_TX_CHANNEL,true);
rmt_write_items(RMT_TX_CHANNEL, &item, 1, true);
rmt_wait_tx_done(RMT_TX_CHANNEL, portMAX_DELAY);
in the control loop code:
rmt_tx_stop(RMT_TX_CHANNEL);
rmt_tx.tx_config.carrier_freq_hz= desired_freq; // set your frequency here
rmt_config(&rmt_tx);
rmt_tx_start(RMT_TX_CHANNEL,true);
xTaskCreatePinnedToCore(coreTask, "coreTask", 2048, (void*)rmt_tx.tx_config.carrier_freq_hz, 0, &xHandle, 1);
rmt_wait_tx_done(RMT_TX_CHANNEL, portMAX_DELAY);
The scope went way above 1Mhz with full control
Around 10-15MHz weird things started to happen.
When I reached 40Mhz my PC locked for unknown reason - maybe USB interference
Cheers