天天看點

STM32F103使用L9110s驅動直流電機(必須簡單易懂)

首先我們來看一下L9110S的驅動手冊:

STM32F103使用L9110s驅動直流電機(必須簡單易懂)
STM32F103使用L9110s驅動直流電機(必須簡單易懂)
STM32F103使用L9110s驅動直流電機(必須簡單易懂)

​注意到IB接的是PB8,IA接的是PB9​

根據第二個圖檔裡面的真值表我們可以得到如下資訊:
STM32F103使用L9110s驅動直流電機(必須簡單易懂)

PB8配置位複用推挽輸出,PB9配置為通用推挽
然後我給PB8配置PWM波,PB9給拉低,那麼電機是不是就是正轉
反轉同理
停止兩個端口同時拉低或者拉高就行了
      
STM32F103使用L9110s驅動直流電機(必須簡單易懂)

接下裡我們來配置一下PWM波,我們配置電機反轉

​PB9配置位複用推挽輸出,PB8配置為通用推挽 然後我給PB9配置PWM波,PB8給拉低,那麼電機是不是就是正轉​

看一下上圖的定時器為TIM4,第4個管道。

void machinery_config(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//開時鐘
/*PB9 複用推挽輸出*/
GPIO_InitTypeDef GPIO_INIT;
GPIO_INIT.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_INIT.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_INIT.GPIO_Pin = GPIO_Pin_9;
GPIO_Init(GPIOB,&GPIO_INIT);

GPIO_INIT.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_INIT.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_INIT.GPIO_Pin = GPIO_Pin_8;
GPIO_Init(GPIOB,&GPIO_INIT);

RCC->APB1ENR |=(0X01<<2);//開TIM4時鐘
//定時器4通道 9 CH4
//時鐘組成
TIM4->PSC = 72;
TIM4->ARR = 1000;
TIM4->CNT = 0;  
TIM4->CR1 &=~(0X01<<4);//計數方向--向上記數
//配置PWM波 有效電平 PWM模式  輸出到響應引腳
TIM4->CCER &=~(0X01<<13);//高電平有效
TIM4->CCMR2 |=(0X06<<12);//PWM模式1 PWM輸出模式
TIM4->CCER |=(0X01<<12);//OC4對應到PB9,将輸出信号配置到指定管腳
TIM4->CCR4=0;//比較值
TIM4->CR1 |=(0X01<<0);//計數器使能
GPIO_ResetBits(GPIOB,GPIO_Pin_8);//拉低PB8

}
      

這樣我們是不是隻需要改變配置裡面的比較值(TIM4->CCR4)就可以實作電機的速度控制了

我們在主函數裡這樣簡單測試一下,每延時3s我讓比較值增加200:

TIM4->CCR4=200;
systick_ms(3000);
TIM4->CCR4=400;
systick_ms(3000);
TIM4->CCR4=600;
systick_ms(3000);
systick_ms(3000);
TIM4->CCR4=800;
systick_ms(3000);
TIM4->CCR4=1000;
systick_ms(3000);

      

ok!這裡就結束了,如果你需要别的控制,你隻需要在滿足你的控制條件後,更改比較值就可以實作電機的速度控制了。

如有不同的見解,歡迎評論區或者私信交流指正。

感覺寫的不錯,拜托觀衆外公一鍵三連。你的認同是我更新最大的動力。

ps:我是真的懶啊!!!!!

繼續閱讀