«

PWM 驱动L298N

Sweetiey 发布于 阅读:229 课程笔记


在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

STM32


扫描二维码,在手机上阅读