tao_z
2021-04-11 6d4ddf7d2a2cd72c58876257700b34c63e5063d3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#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);
}