/** Define pwm output pin.
* P0_1 is connected to LED0 on the EVB.
*/
#define PWM_OUT_PIN P0_1
/** Define pwm complementary output pin.
* P0_2 is connected to LED1 on the EVB.
*/
#define PWM_OUT_P_PIN P0_2
#define PWM_OUT_N_PIN P2_2
#define PWM_TIMER_NUM TIM2
#define PWM_OUT_PIN_PINMUX timer_pwm2
#define PWM_OUT_P_PIN_PINMUX PWM2_P
#define PWM_OUT_N_PIN_PINMUX PWM2_N
/* Config PWM_PERIOD and PWM_DUTY_CYCLE */
#define PWM_PERIOD 1000000 //uint:us
#define PWM_DUTY_CYCLE 50 //uint:percent
/* PWM_HIGH_COUNT = */
#define PWM_HIGH_COUNT (((PWM_PERIOD)*((PWM_DUTY_CYCLE*40)/100))-1) //PWM CLOCK = 40000000
#define PWM_LOW_COUNT (((PWM_PERIOD)*(((100-PWM_DUTY_CYCLE)*40)/100))-1)
#define PWM_DEAD_ZONE_TIME 1 //uint:ms
#define PWM_DEAD_ZONE_SIZE ((PWM_DEAD_ZONE_TIME)*32-1)
void m_set_pwm(uint32_t percent)
{
TIM_TimeBaseInitTypeDef TIM_InitStruct;
if (percent>100)percent=100;
TIM_Cmd(TIM2, DISABLE);
TIM_StructInit(&TIM_InitStruct);
TIM_InitStruct.TIM_PWM_En = PWM_ENABLE;
TIM_InitStruct.TIM_Period = 2000 * 10 - 1 ;
TIM_InitStruct.TIM_PWM_High_Count = percent;//HGIH - 1; //should be large enough to generate a complementary PWM
TIM_InitStruct.TIM_PWM_Low_Count = (100-percent);//LOW - 1 ;
TIM_InitStruct.TIM_Mode = TIM_Mode_UserDefine;
TIM_InitStruct.PWM_Deazone_Size = 0x10;
TIM_InitStruct.PWMDeadZone_En = DEADZONE_ENABLE; //enable to use pwn p/n output
TIM_TimeBaseInit(TIM2, &TIM_InitStruct);
TIM_Cmd(TIM2, ENABLE);
}
void pwm_demo(void)
{
Pad_Config(PWM_OUT_PIN, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_NONE, PAD_OUT_ENABLE, PAD_OUT_HIGH);
Pad_Config(PWM_OUT_P_PIN, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_NONE, PAD_OUT_ENABLE,
PAD_OUT_HIGH);
Pad_Config(PWM_OUT_N_PIN, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_NONE, PAD_OUT_ENABLE,
PAD_OUT_HIGH);
/* Normal mode */
Pinmux_Config(PWM_OUT_PIN, PWM_OUT_PIN_PINMUX);
/* Deadzone mode */
Pinmux_Config(PWM_OUT_P_PIN, PWM_OUT_P_PIN_PINMUX);
Pinmux_Config(PWM_OUT_N_PIN, PWM_OUT_N_PIN_PINMUX);
//=====================
RCC_PeriphClockCmd(APBPeriph_TIMER, APBPeriph_TIMER_CLOCK, ENABLE);
#define DELAY_TIME (100000)
uint32_t i;
uint32_t j=0;
while (1)
{
for (j=0; j<101; j++)
{
m_set_pwm(j);
for (i = 0; i < DELAY_TIME; i++);
}
while(j)
{
m_set_pwm(j);
j--;
for (i = 0; i < DELAY_TIME; i++);
}
}
}
RTL8762DW呼吸灯
最新推荐文章于 2021-08-06 15:03:31 发布