直流电机PWM控速(无中断)

PWM控制占空比,stm32IO口:PA6,PA7接直流电机的两个引脚,查看原理图,分别对应定时器3的通道1跟2,电机有正反转 。PWM输出,如果没有加中断的话,程序会一直进行PWM输出,我看网上推荐是有中断比较好,作为一名初学者,我还有很多地方不懂,不断试错,发现问题,找出问题,解决问题。

 pwm.c

#include "pwm.h"
//PA6 TIM3的通道1
//PA7 TIM3的通道2
void TIM3_PWM_Init(u16 arr, u16 psc)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_OCInitTypeDef TIM_OCInitStruct;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);

//	GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);  //因为使用的io口有默认的复用功能,所以不用重映射

	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
	GPIO_InitStruct. GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_Init(GPIOA, &GPIO_InitStruct);

	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;
	GPIO_InitStruct. GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_Init(GPIOA, &GPIO_InitStruct);

	TIM_TimeBaseInitStruct.TIM_Period = arr;
	TIM_TimeBaseInitStruct.TIM_Prescaler = psc;
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);

	TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM2;       //pwm模式2
	TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OC1Init(TIM3, &TIM_OCInitStruct);      //定时器3通道1初始化

	TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM2;
	TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OC2Init(TIM3, &TIM_OCInitStruct);    //定时器3通道2初始化

	TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //定时器3的通道2

	TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);    //定时器3的通道1
	TIM_Cmd(TIM3, ENABLE);

}


pwm.h

#ifndef __PWM_H
#define __PWM_H
#include "sys.h"


void TIM3_PWM_Init(u16 arr, u16 psc);



#endif /* __PWM_H */

直流电机的c

#include "minl298n.h"

//马达A,IN1-->PA6, IN2-->PA7
void INx_Init(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
 	
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	 //使能PA端口时钟
	
 	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;				 //端口配置
 	GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_Out_PP; 		 //推挽输出
 	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
 	GPIO_Init(GPIOA, &GPIO_InitStructure);					 //根据设定参数初始化GPIOA
 	GPIO_SetBits(GPIOA,GPIO_Pin_6 | GPIO_Pin_7);						 //PB.5 输出高,关闭

}

直流电机的头文件

#ifndef __MINL298N_H
#define __MINL298N_H

#include "sys.h"

#define  IN1  PAout(6)// PA6
#define  IN2  PAout(7)// PA6

void INx_Init(void);


#endif /* __MINL298N_H */

main.c

测试电机

#include "delay.h"
#include "sys.h"
#include "usart.h"	 
#include "pwm.h"  

//串口1接电脑串口助手,串口2接wifi模块
void Hardware_Init(void)
{
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);		
	uart_init(115200);				
	delay_init();	
	TIM3_PWM_Init(899, 0);
	printf("Hardware_Init ok\r\n");
	
}	 
 
int main(void)
 {
	  u16 led0pwmval =600;
	  Hardware_Init();
	  delay_ms(10);
	  TIM_SetCompare1(TIM3, led0pwmval); 
	  TIM_SetCompare2(TIM3, 400);

  while(1)
  {
	delay_ms(10);
//		TIM_SetCompare2(TIM3, led0pwmval);
  }
	
}




 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值