PWM 驱动L298N
在PWM呼吸灯的基础上加了一个Pin
PWM代码
void PWM_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//TIM2是APB1的外设,开启时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//配置时钟
GPIO_InitTypeDef A1;
A1.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
A1.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_0;//PA0//PA1两路PWM
A1.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&A1);//初始化GPIO
TIM_InternalClockConfig(TIM2);//选择时基单元的时钟为内部时钟
TIM_TimeBaseInitTypeDef A;
A.TIM_ClockDivision = TIM_CKD_DIV1;
A.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
A.TIM_Period = 20000-1;//0~65535 周期 ARR(AutoReloadResistor)自动重装器
A.TIM_Prescaler = 72-1;//TIM_Prescaler PSC预分频器的值
/*
PWM频率F=CK_PSC/(PSC+1)/(ARR+1) CK_PSC=72M
占空比Puty=CCR/(ARR+1)
PWM分辨率Reso=1/(ARR+1)
*/
A.TIM_RepetitionCounter =0 ;//不用
TIM_TimeBaseInit(TIM2,&A);//配置时基单元初始化
TIM_OCInitTypeDef TS;
TIM_OCStructInit(&TS);
TS.TIM_OCMode =TIM_OCMode_PWM1 ;
TS.TIM_OCPolarity= TIM_OCPolarity_High;
TS.TIM_OutputState = TIM_OutputState_Enable;//输出使能
//TS.TIM_Pulse = 90;//CCR值
TIM_OC2Init(TIM2,&TS);//PA1
TIM_OC1Init(TIM2,&TS);//PA0
//启动定时器
TIM_Cmd(TIM2,ENABLE);
}
void PWM_SetDuty(float Duty)
{
float jb = Duty/100*20000;
TIM_SetCompare2(TIM2,jb);//PA1
TIM_SetCompare1(TIM2,jb);//PA0
}
L298N代码
void L298N_Init(void){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//配置时钟
GPIO_InitTypeDef A1;
A1.GPIO_Mode = GPIO_Mode_Out_PP;//复用推挽输出
A1.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
A1.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&A1);//初始化GPIO
}
void L298N_IN1(int a)
{
if(a==0)
GPIO_ResetBits(GPIOA,GPIO_Pin_4);//设置低电平
else
GPIO_SetBits(GPIOA,GPIO_Pin_4);//设置高电平
}
void L298N_IN2(int a){
if(a==0)
GPIO_ResetBits(GPIOA,GPIO_Pin_5);//设置低电平
else
GPIO_SetBits(GPIOA,GPIO_Pin_5);//设置高电平
}
void L298N_IN3(int a){
if(a==0)
GPIO_ResetBits(GPIOA,GPIO_Pin_6);//设置低电平
else
GPIO_SetBits(GPIOA,GPIO_Pin_6);//设置高电平
}
void L298N_IN4(int a){
if(a==0)
GPIO_ResetBits(GPIOA,GPIO_Pin_7);//设置低电平
else
GPIO_SetBits(GPIOA,GPIO_Pin_7);//设置高电平
}
主函数测试代码
int main(void)
{
OLED_Clear();
OLED_Init();
OLED_ColorTurn(0);//0正常显示,1 反色显示
OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示
PWM_Init();
L298N_Init();
while(1)
{
//OLED_ShowString(1,5,"Sweetiey.com",12,1);
//OLED_ShowNum(1,25,i,3,8,1);
//OLED_Refresh();
L298N_IN1(1);
L298N_IN2(0);
L298N_IN3(1);
L298N_IN4(0);
PWM_SetDuty(5);
Delay_s(5);
PWM_SetDuty(20);
Delay_s(5);
PWM_SetDuty(50);
Delay_s(5);
PWM_SetDuty(70);
Delay_s(5);
PWM_SetDuty(99);
Delay_s(5);
}
}
L298N的使能端接PA0,PA1.IN1~IN4接Pin4567
扫描二维码,在手机上阅读