stm32f103c8t6通过PB3口高低电平控制l9110电机驱动风扇
时间: 2023-07-08 08:22:43 浏览: 110
您好!针对您的问题,我可以提供以下代码参考:
```c
#include "stm32f10x.h"
#define TIM_PERIOD 999
void TIM_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
/* 使能TIM时钟 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
/* 配置TIM时间基准 */
TIM_TimeBaseStructInit(&TIM_TimeBaseInitStruct);
TIM_TimeBaseInitStruct.TIM_Period = TIM_PERIOD;
TIM_TimeBaseInitStruct.TIM_Prescaler = 71; // 72MHz / (71+1) = 1MHz
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
/* 使能TIM中断 */
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
/* 启动TIM */
TIM_Cmd(TIM2, ENABLE);
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
/* 使能GPIOB时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
/* 配置PB3为推挽输出 */
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);
}
int main(void)
{
GPIO_Configuration();
TIM_Configuration();
while (1) {
/* 在这里添加您的代码 */
}
}
void TIM2_IRQHandler(void)
{
static int count = 0;
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) {
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
/* 控制PB3口高低电平 */
if (count++ < (TIM_PERIOD / 2)) {
GPIO_SetBits(GPIOB, GPIO_Pin_3); // PB3输出高电平
} else {
GPIO_ResetBits(GPIOB, GPIO_Pin_3); // PB3输出低电平
if (count >= TIM_PERIOD) {
count = 0;
}
}
}
}
```
这段代码使用定时器TIM2的中断来控制GPIOB的PB3口高低电平,从而控制L9110电机驱动风扇的启停。具体实现方法是:在TIM2中断服务函数中,通过计数器count不断循环计数,当count小于定时器周期的一半时,将PB3口输出高电平,否则将PB3口输出低电平。由于计数器count的最大值与TIM_PERIOD相等,因此通过修改TIM_PERIOD的值可以控制风扇的启停频率。
阅读全文