#include "pwm.h"
|
#include "interrupt_interface.h"
|
#include "stm8s_tim1.h"
|
#include "stm8s_tim2.h"
|
|
#define CCR1_Val ((uint16_t)800)
|
#define CCR2_Val ((uint16_t)250)
|
#define CCR3_Val ((uint16_t)125)
|
|
static void timer2_interrupt(void)
|
{
|
TIM2_ClearFlag(TIM2_FLAG_CC1);
|
TIM2_ClearFlag(TIM2_FLAG_CC2);
|
TIM2_ClearFlag(TIM2_FLAG_CC3);
|
}
|
|
/**
|
* @brief Configure TIM1 to generate 6 Steps PWM signal
|
* @param None
|
* @retval None
|
*/
|
static void TIM1_Config(void)
|
{
|
/* TIM1 Peripheral Configuration */
|
TIM1_DeInit();
|
TIM1_InternalClockConfig();
|
/* Time Base configuration */
|
/*
|
TIM1_Period = 1023
|
TIM1_Prescaler = 0
|
TIM1_CounterMode = TIM1_COUNTERMODE_UP
|
TIM1_RepetitionCounter = 0
|
*/
|
TIM1_TimeBaseInit(0, TIM1_COUNTERMODE_UP, 999, 0); //fCK_CNT = fCK_PSC / (PSCR[15:0] + 1) =16M/1=16M fpwm=16M/(999+1)=16k
|
|
/*
|
TIM1_OCMode = TIM1_OCMODE_PWM2
|
TIM1_OutputState = TIM1_OUTPUTSTATE_ENABLE
|
TIM1_OutputNState = TIM1_OUTPUTNSTATE_ENABLE
|
TIM1_Pulse = CCR1_Val
|
TIM1_OCPolarity = TIM1_OCPOLARITY_LOW
|
TIM1_OCNPolarity = TIM1_OCNPOLARITY_HIGH
|
TIM1_OCIdleState = TIM1_OCIDLESTATE_SET
|
TIM1_OCNIdleState = TIM1_OCIDLESTATE_RESET
|
|
*/
|
//110:PWM模式1- 在向上计数时,一旦TIM1_CNT<TIM1_CCR1时通道1为有效电平
|
TIM1_OC1Init(TIM1_OCMODE_PWM1, TIM1_OUTPUTSTATE_ENABLE, TIM1_OUTPUTNSTATE_ENABLE,
|
CCR1_Val, TIM1_OCPOLARITY_HIGH, TIM1_OCNPOLARITY_HIGH, TIM1_OCIDLESTATE_RESET,
|
TIM1_OCNIDLESTATE_SET);
|
|
/*TIM1_Pulse = CCR2_Val*/
|
TIM1_OC2Init(TIM1_OCMODE_PWM1, TIM1_OUTPUTSTATE_ENABLE, TIM1_OUTPUTNSTATE_ENABLE,
|
CCR2_Val, TIM1_OCPOLARITY_HIGH, TIM1_OCNPOLARITY_HIGH, TIM1_OCIDLESTATE_RESET,
|
TIM1_OCNIDLESTATE_SET);
|
|
/*TIM1_Pulse = CCR3_Val*/
|
TIM1_OC3Init(TIM1_OCMODE_PWM1, TIM1_OUTPUTSTATE_ENABLE, TIM1_OUTPUTNSTATE_ENABLE,
|
CCR3_Val, TIM1_OCPOLARITY_HIGH, TIM1_OCNPOLARITY_HIGH, TIM1_OCIDLESTATE_RESET,
|
TIM1_OCNIDLESTATE_SET);
|
|
// /* Automatic Output enable, Break, dead time and lock configuration*/
|
TIM1_BDTRConfig(TIM1_OSSISTATE_ENABLE, TIM1_LOCKLEVEL_OFF, 10, TIM1_BREAK_DISABLE,
|
TIM1_BREAKPOLARITY_LOW, TIM1_AUTOMATICOUTPUT_ENABLE);
|
|
/* TIM1 counter enable */
|
TIM1_Cmd(ENABLE);
|
}
|
|
/**
|
* @brief Configure TIM1 to generate 6 Steps PWM signal
|
* @param None
|
* @retval None
|
*/
|
static void TIM2_Config(void)
|
{
|
/* TIM2 Peripheral Configuration */
|
TIM2_DeInit();
|
|
TIM2_ICInit(TIM2_CHANNEL_1, TIM2_ICPOLARITY_FALLING, TIM2_ICSELECTION_DIRECTTI,
|
TIM2_ICPSC_DIV1, 0x0);
|
|
TIM2_ICInit(TIM2_CHANNEL_2, TIM2_ICPOLARITY_FALLING, TIM2_ICSELECTION_DIRECTTI,
|
TIM2_ICPSC_DIV1, 0x0);
|
|
TIM2_ICInit(TIM2_CHANNEL_3, TIM2_ICPOLARITY_FALLING, TIM2_ICSELECTION_DIRECTTI,
|
TIM2_ICPSC_DIV1, 0x0);
|
|
/* Clear CC1 Flag*/
|
TIM2_ClearFlag(TIM2_FLAG_CC1);
|
TIM2_ClearFlag(TIM2_FLAG_CC2);
|
TIM2_ClearFlag(TIM2_FLAG_CC3);
|
|
TIM2_ITConfig(TIM2_IT_CC1, ENABLE);
|
TIM2_ITConfig(TIM2_IT_CC2, ENABLE);
|
TIM2_ITConfig(TIM2_IT_CC3, ENABLE);
|
|
/* TIM1 counter enable */
|
TIM2_Cmd(ENABLE);
|
}
|
|
extern void PWM_Config(void)
|
{
|
TIM1_Config();
|
/* Main Output Enable */
|
TIM1_CtrlPWMOutputs(ENABLE);
|
// TIM1_SetCompare1(0);
|
TIM2_Config();
|
RegInterruptFunc(timer2_interrupt, 2);
|
}
|
|
extern void PWM_SetDuty1(unsigned int value)
|
{
|
TIM1_SetCompare1(value);
|
}
|
extern void PWM_SetDuty2(unsigned int value)
|
{
|
TIM1_SetCompare2(value);
|
}
|
extern void PWM_SetDuty3(unsigned int value)
|
{
|
TIM1_SetCompare3(value);
|
}
|