STM32输出PWM驱动直流电机(一)


STM32输出PWM驱动直流电机需要 电机驱动板(我是买的这款),STM32需要输出一路PWM用于驱动电机,两路高低电平控制电机正反转。PWM输出选用TIM3定时器CH1通道控制(PA6),高低电平选用PD0、PD1控制。

定时器PWM初始化(timer.c)

void TIM3_PWM_Init(void)
{  
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	
	//TIM3 GPIO 初始化
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   //使能GPIO外设时钟
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 ;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);    
 
	
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);  //使能定时器3时钟
	 
	
	//配置PWM输出频率100Hz,占空比为CCR/1000(千分之CCR)    10ms
	//Fpwm = 72M / ((arr+1)*(psc+1))(单位:Hz)    72000000/(1000*720)
	//76MHz = 76000000hz
	TIM_TimeBaseStructure.TIM_Period=1000 - 1;	//设置在下一个更新事件装入活动的自动重装载寄存器周期的值1000
	TIM_TimeBaseStructure.TIM_Prescaler= 720 -1; 	//设置用来作为TIMx时钟频率除数的预分频值720
	TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;	
	TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;	//向上计数
	TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
	
	//初始化TIM
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;   //选择定时器模式:TIM脉冲宽度调制模式1
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;   //比较输出使能
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;   //输出极性:TIM输出比较极性高
	TIM_OCInitStructure.TIM_Pulse = 0;   //默认输出占空比0
	
	// CH1
	TIM_OC1Init(TIM3, &TIM_OCInitStructure);   //根据T指定的参数初始化外设TIM3 OC1
	TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR1上的预装载寄存器
	
	TIM_Cmd(TIM3, ENABLE);  //使能TIM3
}

控制引脚初始化(timer.c)

void MotorInit(void)   //正反转控制引脚
{
	//定义句柄
	GPIO_InitTypeDef GPIO_InitStructure;
	//GPIO挂上时钟
	RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD , ENABLE);
	//PD0、1初始化
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 ;	//引脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 	//50MHz
	GPIO_Init(GPIOD,&GPIO_InitStructure);	
}

主函数

int main(void)
{	 
	delay_init();	    	 //延时函数初始化	 
    TIM3_PWM_Init();	 
	MotorInit();   
    while(1)
	{
 		Cargo;	//定义timer.h中   #define CarGo  PDout(0)=0;PDout(1)=1
        TIM_SetCompare1(TIM3,400);  //预装载值1000与400比较,占空比40%
	}
}	

结果可通过keil仿真查看。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值