基于stm32和红外测速控制直流电机转速200到3000的stm32程序
时间: 2023-06-26 22:10:25 浏览: 53
以下是一个基于STM32和红外测速的直流电机转速控制程序的示例:
```c
#include "stm32f10x.h"
#define IR_PIN GPIO_Pin_0 //红外传感器输入引脚
#define IR_PORT GPIOA //红外传感器输入端口
#define MOTOR_PIN GPIO_Pin_1 //电机控制输出引脚
#define MOTOR_PORT GPIOB //电机控制输出端口
volatile uint16_t count = 0; //计数器
volatile uint16_t rpm = 0; //转速(rpm)
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET) //定时器更新中断
{
count++; //计数器加1
TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //清除中断标志位
}
}
int main(void)
{
//初始化红外传感器输入引脚
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA时钟
GPIO_InitStructure.GPIO_Pin = IR_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置为上拉输入
GPIO_Init(IR_PORT, &GPIO_InitStructure);
//初始化电机控制输出引脚
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOB时钟
GPIO_InitStructure.GPIO_Pin = MOTOR_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置为推挽输出
GPIO_Init(MOTOR_PORT, &GPIO_InitStructure);
//初始化定时器2
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
uint16_t PrescalerValue = 71; //预分频器值,定时器时钟为72MHz/72=1MHz
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能TIM2时钟
TIM_TimeBaseInitStruct.TIM_Period = 999; //计数器自动重装值
TIM_TimeBaseInitStruct.TIM_Prescaler = PrescalerValue; //预分频器
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; //时钟分频
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0x0000; //重复计数器值
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //使能更新中断
TIM_Cmd(TIM2, ENABLE); //使能定时器2
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //定时器2中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //子优先级1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
while (1)
{
if (count > 0) //计数器不为0
{
rpm = 60000000 / (count * 2); //计算转速
count = 0; //计数器清零
}
if (rpm > 200 && rpm < 3000) //转速在200~3000rpm之间
{
GPIO_SetBits(MOTOR_PORT, MOTOR_PIN); //控制电机转动
}
else
{
GPIO_ResetBits(MOTOR_PORT, MOTOR_PIN); //控制电机停止
}
}
}
```
该程序通过红外传感器输入引脚读取电机转子的转速信号,使用定时器2计数器进行计数,然后根据计数器的值计算转速。当转速在200~3000rpm之间时,控制电机转动;否则,控制电机停止。该程序可以根据实际需求进行修改和优化。