java控制电机_使用STM32L TIM PWM控制 Servo 电机

本文介绍了如何使用STM32L1微控制器的TIM4外设通过PWM控制伺服电机,以实现从0°到180°的平滑移动。在代码中,作者遇到伺服电机不平滑移动的问题,怀疑与预分频值计算有关,并寻求解决方案。
摘要由CSDN通过智能技术生成

所以我试图通过PWM使用STM32L1来控制 Servo . 下面是完整的代码,不需要库 . 当我上传并运行此代码时, Servo 计时几次,而不是实际平滑地移动到所需的位置600(0 *),1100(50 *),1600(100 *)和2100(150 *) . 我相信这与预分频值计算有关,而且我不确定在微秒内提及ARR是否正确,如果没有,我如何将其配置为读取微秒而不是毫秒 . 有关更多详细信息,请参阅代码中的注释 .

#include

#include "stm32l1xx.h"

// Keil::Device:Startup

// initialization of GPIOB

void TIM4_Init(){

RCC->AHBRSTR |= RCC_AHBRSTR_GPIOARST; /* Reset GPIOB clock */

RCC->AHBENR |= RCC_AHBENR_GPIOBEN; /* Enable GPIOB clock */

GPIOB->MODER &= ~(0x03 << (2*6)); /* Clear bit 11 & 12 Alternate mode*/

GPIOB->MODER |= 0x02 << (2*6); /* set as Alternate mode*/

GPIOB->OSPEEDR &= ~(0x03<< (2*6)); /* 40 MHz speed */

GPIOB->OSPEEDR |= 0x03<< (2*6); /* 40 MHz speed */

GPIOB->PUPDR &= ~(1<<6); /* NO PULL-UP PULL-DOWN */

GPIOB->OTYPER &= ~(1<<6); /* PUSH-PULL */

GPIOB->AFR[0] |= 0x2 << (4*6); /* Pin6 set as alternate function 2 (TIM4) */

RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;

TIM4->PSC = 16; //prescale value, AHB/APB1 Fmax=32MHz / 2

TIM4->ARR = 20000-1; //motor Freq = 50Hz, Period(ARR)= 1/50 = 20000us

// initialization of TIM & PWM

TIM4->CCMR1 |= TIM_CCMR1_OC1M; // 111: PWM mode 2 - In upcounting, channel 1 is inactive

//as long as TIMx_CNT

// In downcounting, channel 1 is active as long as

//TIMx_CNT>TIMx_CCR1 else inactive.

TIM4->CCMR1 |= TIM_CCMR1_OC1PE;

TIM4->CR1 |= TIM_CR1_ARPE;

TIM4->CCER |= TIM_CCER_CC1E;

TIM4->EGR |= TIM_EGR_UG;

TIM4->SR &= ~TIM_SR_UIF;

TIM4->DIER |= TIM_DIER_UIE;

TIM4->CR1 |= TIM_CR1_CEN;

}

// set servo to 4 positions in sequence

int main(void){

int i;

int position=600; // initial motor position

TIM4_Init();

while (1){

if ((position >=600)|| (position <=2100))

position = position+500; // motor positions will be 600(0*), 1100(50*), 1600(100*)

//, 2100(150*)

TIM4->CCR1 = position;

for(i=0;i<1000;i++); // short delay

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值