首先我們來看一下L9110S的驅動手冊:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SNzEDMzEWMlJjN4ETO4MGOxYzX4ADOwETMxEzLcFTMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL4M3Lc9CX6MHc0RHaiojIsJye.png)
注意到IB接的是PB8,IA接的是PB9
根據第二個圖檔裡面的真值表我們可以得到如下資訊: PB8配置位複用推挽輸出,PB9配置為通用推挽
然後我給PB8配置PWM波,PB9給拉低,那麼電機是不是就是正轉
反轉同理
停止兩個端口同時拉低或者拉高就行了
接下裡我們來配置一下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:我是真的懶啊!!!!!