добавлены функции на отправку сигнала. что-то рисуют и ногами, и через ШИМ, вроде похоже на результаты с уно, но через шим на паузе иногда в верхнем состоянии остаемся, а не в нижнем
This commit is contained in:
parent
fe791d754d
commit
9e317ce9f3
@ -2072,6 +2072,65 @@ extern "C" void __attribute__((noinline, section(".ram_text"), optimize("O3")))
|
|||||||
TIM16_CLEAR_INT_MASK(htimer16_0, 0xFFFFFFFF); // reset timer interrupt flags
|
TIM16_CLEAR_INT_MASK(htimer16_0, 0xFFFFFFFF); // reset timer interrupt flags
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# if defined(SEND_PWM_BY_TIMER)
|
||||||
|
#include "pins_arduino.h"
|
||||||
|
#define IR_SEND_PIN 3
|
||||||
|
|
||||||
|
static TIMER32_HandleTypeDef ir_sender_htimer;
|
||||||
|
static TIMER32_CHANNEL_HandleTypeDef ir_sender_htimer_channel;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* timerConfigForSend() is used exclusively by IRsend::enableIROut()
|
||||||
|
* Set output pin mode and disable receive interrupt if it uses the same resource
|
||||||
|
*/
|
||||||
|
void timerConfigForSend(uint16_t aFrequencyKHz)
|
||||||
|
{
|
||||||
|
uint32_t pwmTopVal = 0;
|
||||||
|
if ((aFrequencyKHz*1000) <= PWM_FREQUENCY_MAX)
|
||||||
|
pwmTopVal = F_CPU/(aFrequencyKHz*1000)-3;
|
||||||
|
else
|
||||||
|
ErrorMsgHandler("timerConfigForSend(): invalid frequency for IR sending");
|
||||||
|
|
||||||
|
// initialization of the required timer
|
||||||
|
ir_sender_htimer.Instance = pwmPinToTimer(IR_SEND_PIN);
|
||||||
|
ir_sender_htimer.Top = pwmTopVal;
|
||||||
|
ir_sender_htimer.State = TIMER32_STATE_DISABLE;
|
||||||
|
ir_sender_htimer.Clock.Source = TIMER32_SOURCE_PRESCALER;
|
||||||
|
ir_sender_htimer.Clock.Prescaler = 0; // Prescaler = 1
|
||||||
|
ir_sender_htimer.InterruptMask = 0;
|
||||||
|
ir_sender_htimer.CountMode = TIMER32_COUNTMODE_FORWARD;
|
||||||
|
HAL_Timer32_Init(&ir_sender_htimer);
|
||||||
|
|
||||||
|
// gpio init as timer channel pin
|
||||||
|
HAL_GPIO_PinConfig(digitalPinToPort(IR_SEND_PIN), digitalPinToBitMask(IR_SEND_PIN),
|
||||||
|
HAL_GPIO_MODE_TIMER_SERIAL, HAL_GPIO_PULL_NONE, HAL_GPIO_DS_2MA);
|
||||||
|
|
||||||
|
ir_sender_htimer_channel.TimerInstance = ir_sender_htimer.Instance;
|
||||||
|
ir_sender_htimer_channel.ChannelIndex = pwmPinToTimerChannel(IR_SEND_PIN);
|
||||||
|
ir_sender_htimer_channel.PWM_Invert = TIMER32_CHANNEL_NON_INVERTED_PWM;
|
||||||
|
ir_sender_htimer_channel.Mode = TIMER32_CHANNEL_MODE_PWM;
|
||||||
|
ir_sender_htimer_channel.CaptureEdge = TIMER32_CHANNEL_CAPTUREEDGE_RISING;
|
||||||
|
ir_sender_htimer_channel.OCR = ((pwmTopVal * IR_SEND_DUTY_CYCLE_PERCENT)/100);
|
||||||
|
ir_sender_htimer_channel.Noise = TIMER32_CHANNEL_FILTER_OFF;
|
||||||
|
HAL_Timer32_Channel_Init(&ir_sender_htimer_channel);
|
||||||
|
|
||||||
|
HAL_Timer32_Start(&ir_sender_htimer);
|
||||||
|
}
|
||||||
|
|
||||||
|
void enableSendPWMByTimer()
|
||||||
|
{
|
||||||
|
// start timer with initialized channel
|
||||||
|
HAL_Timer32_Value_Clear(&ir_sender_htimer);
|
||||||
|
HAL_Timer32_Channel_Enable(&ir_sender_htimer_channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
void disableSendPWMByTimer()
|
||||||
|
{
|
||||||
|
HAL_Timer32_Channel_Disable(&ir_sender_htimer_channel);
|
||||||
|
digitalWriteFast(IR_SEND_PIN, 1);
|
||||||
|
}
|
||||||
|
# endif // defined(SEND_PWM_BY_TIMER)
|
||||||
|
|
||||||
/***************************************
|
/***************************************
|
||||||
* Unknown CPU board
|
* Unknown CPU board
|
||||||
***************************************/
|
***************************************/
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user