l298n测试代码

#include "stm32f4xx.h"
#include "delay.h"
#include "key.h"
#include "led.h" 
#include "pwm.h"
#include "Motor.h"

//STM32F407ZGT6——L298N
//EN_A---PF6
//IN0----PD0
//IN1----PD1
//EN_B---PF7
//IN2----PB5
//IN3----PB6

int main(void)
{

u8 key;
u16 Motor1pwmval=499;    
u16 Motor2pwmval=499;		
u8 Level1 = 0;
u8 Level2 = 0;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组 2
delay_init(168); //初始化延时函数
MOTOR_Init();
LED_Init(); //初始化 LED 端口
KEY_Init();
TIM13_PWM_Init(500-1,84-1);	//84M/84=1Mhz的计数频率,重装载值500,所以PWM频率为 1M/500=2Khz. 
TIM11_PWM_Init(500-1,84-1);

LED1 = 1;LED0 = 1;

IN0 = 0;IN1 = 1;ENABLE_A = 1;
IN2 = 0;IN3 = 1;ENABLE_B = 1;	
while(1)
  {
			key=KEY_Scan(0); 		 
			if(key)
			{
	  
				if(key==1)//风速
				{
					Level1++;if(Level1==4)Level1 = 0;						
				}
				else if(key==4)
				{
					Level2++;if(Level2==4)Level2 = 0;	
				}
			}	
			switch(Level1)
			{
				case 0:Motor1pwmval = 499;LED0 = 1;
					break;
				case 1:Motor1pwmval = 250;LED0 = 0;
					break;
				case 2:Motor1pwmval = 100;LED0 = 0;
					break;
				case 3:Motor1pwmval = 0;LED0 = 0;
					break;
			}
			switch(Level2)
			{
				case 0:Motor2pwmval = 499;LED1 = 1;
					break;
				case 1:Motor2pwmval = 250;LED1 = 0;
					break;
				case 2:Motor2pwmval = 100;LED1 = 0;
					break;
				case 3:Motor2pwmval = 0;LED1 = 0;
					break;
			}
		TIM_SetCompare1(TIM13,Motor1pwmval);	//修改比较值,修改占空比
		TIM_SetCompare1(TIM11,Motor2pwmval);	//修改比较值,修改占空比				
	}
}

使能口初始化

#include "Motor.h"
//初始化PB12和PB13为输出口.并使能这两个口的时钟		    
//MOTOR IN1 IN2 IO初始化
void MOTOR_Init(void) 
{
 GPIO_InitTypeDef  GPIO_InitStructure;
 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //推挽输出
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化	

 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //推挽输出
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化		

// GPIO_InitTypeDef  GPIO_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //推挽输出
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化	

 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //推挽输出
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化	

}

//初始化逻辑控制口 GPIOD 0 1 3 4 对应后驱的IN 1234

void IO_Init1 (void)
{
GPIO_InitTypeDef  GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
//使能GPIOF时钟
 //GPIOF9,F10初始化设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1| GPIO_Pin_3| GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化


}

//初始化逻辑控制口 GPIOE 2 3 5 6对应前驱的IN 1234

void  IO_Init2 (void)

{

GPIO_InitTypeDef  GPIO_InitStructure;

 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOE时钟

//GPIOF9,F10初始化设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3| GPIO_Pin_5| GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化
}

初始化定时器

// TIM3 通道1234初始化 GPIOC 6789复用为PWM输出  其中 PC6控制后驱右马达 PC7控制后驱左马达

//TIM3 PWM部分初始化 
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM3_PWM_Init(u32 arr,u32 psc)
{		 					 
//此部分需手动修改IO口设置

GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);  	//TIM3时钟使能    
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); 	//使能PORTC时钟	

GPIO_PinAFConfig(GPIOC,GPIO_PinSource6,GPIO_AF_TIM3); //GPIOC6复用为定时器3	
GPIO_PinAFConfig(GPIOC,GPIO_PinSource7,GPIO_AF_TIM3); //GPIOC7复用为定时器3
GPIO_PinAFConfig(GPIOC,GPIO_PinSource8,GPIO_AF_TIM3); //GPIOC8复用为定时器3
GPIO_PinAFConfig(GPIOC,GPIO_PinSource9,GPIO_AF_TIM3); //GPIOC9复用为定时器3
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;           //GPIOC6、7 8、9
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;	//速度100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;        //上拉
GPIO_Init(GPIOC,&GPIO_InitStructure);              //初始化PC6、7 8、9



  
TIM_TimeBaseStructure.TIM_Prescaler=psc;  //定时器分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStructure.TIM_Period=arr;   //自动重装载值
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; 
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);//初始化定时器3

//初始化TIM3 Channel1 PWM模式	 
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
                   
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低
TIM_OC1Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM1 4OC1
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM14在CCR1上的预装载寄存器
//初始化TIM3 Channel2 PWM模式	 
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
                

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低
TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM1 4OC1
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM14在CCR1上的预装载寄存器
//初始化TIM3 Channel3 PWM模式	 
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2

   

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低
TIM_OC3Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM1 4OC1
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM14在CCR1上的预装载寄存器
//初始化TIM3 Channel4 PWM模式	 
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
          

 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低
TIM_OC4Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM1 4OC1
TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM14在CCR1上的预装载寄存器

TIM_ARRPreloadConfig(TIM3,ENABLE);//ARPE使能 
TIM_Cmd(TIM3, ENABLE);  //使能TIM3						  
}  

定时器间隔计算转速

#include "stm32f10x.h"
// PID参数float
float  Kp = 1.0;
float Ki = 0.1;
float Kd = 0.01;
// 目标转速float 
float target_speed = 100.0;
// 编码器计数器uint32_t 
u32 encoder_count = 0;
// 上一次的误差值float 
float last_error = 0.0;
// 积分误差float 
float integral_error = 0.0;
// 控制PWM输出void 
void set_pwm(float duty_cycle) {    TIM_OC_InitTypeDef sConfigOC;    sConfigOC.OCMode = TIM_OCMODE_PWM1;    sConfigOC.Pulse = duty_cycle * 1000; 
// PWM占空比,范围为0到1000    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;    HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);    HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);}
// 计算PID输出float 
float pid_controller(float speed) {    float error = target_speed - speed;    float derivative_error = error - last_error;    integral_error += error;    float output = Kp * error + Ki * integral_error + Kd * derivative_error;    last_error = error;    return output;}
// 获取编码器计数器的值void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) {    if (htim->Instance == TIM1) {        encoder_count++;    }}int main(void) {    HAL_Init();    SystemClock_Config();   
 MX_GPIO_Init();   
  MX_TIM1_Init();  
  MX_TIM2_Init();  
  // 启动编码器  
    HAL_TIM_IC_Start_IT(&htim1, TIM_CHANNEL_1);    while (1) {      
    // 获取当前转速        
    float speed = encoder_count * 60.0 / 100.0;        encoder_count = 0;     
       // 计算PID输出       
        float output = pid_controller(speed);      
         // 设置PWM输出      
           set_pwm(output);    }}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值