先上代码
python 树莓派版本,通俗表现原理。stm32 C语言版本在后面
import RPi.GPIO as GPIO
import time
mode=2
IN1=11
def setup():
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(IN1, GPIO.OUT)
def set():
print "set"
try:
print "High"
while(1):
GPIO.output(IN1,0)
time.sleep(0.02-0.002)
GPIO.output(IN1,1)
time.sleep(0.002)
except:
print "low"
while(1):
GPIO.output(IN1,0)
time.sleep(0.02-0.001)
GPIO.output(IN1,1)
time.sleep(0.001)
def loop():
print "LOOP"
print "run"
try:
while(1):
GPIO.output(IN1,0)
time.sleep(0.02-0.001)
GPIO.output(IN1,1)
time.sleep(0.001)
except:
while(1):
GPIO.output(IN1,0)
time.sleep(0.02-0.00199)
GPIO.output(IN1,1)
time.sleep(0.00199)
'''
if(up>=0.018):
up=up
else:
up=up+0.0001
'''
setup()
if( mode==1):
set()
elif(mode==2):
loop()
C语言版本
/***********************************************
功能:输出PWM的定时器2初始化
输入参数:无
输出:无
描述:调用该函数,初始化定时器2为PWM输出模式
硬件连接:PA0,PA1,PA2,PA3
***********************************************/
void MotorInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
uint16_t PrescalerValue = 0; //控制电机PWM频率
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //打开外设A的时钟和复用时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 ,ENABLE); //打开定时器2时钟
// 设置GPIO功能。
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 复位定时器。
//TIM_DeInit(TIM2);
// 配置计时器。
//PrescalerValue = (uint16_t) (SystemCoreClock / 24000000) - 1;
PrescalerValue =71;
TIM_TimeBaseStructure.TIM_Period = 19999; //设为50hz
TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; //pwm时钟分频
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
// 配置TIM2为PWM输出模式
//TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
//TIM_OCInitStructure.TIM_Pulse = 0; //0
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM2,&TIM_OCInitStructure);
TIM_OC2Init(TIM2,&TIM_OCInitStructure);
TIM_OC3Init(TIM2,&TIM_OCInitStructure);
TIM_OC4Init(TIM2,&TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);
// 启动计时器。
TIM_Cmd(TIM2,ENABLE);
//printf("Motor init success...
");
}
//下面是启动方法
TIM_SetCompare1(TIM2,999);
TIM_SetCompare2(TIM2,999);
TIM_SetCompare3(TIM2,999);
TIM_SetCompare4(TIM2,999); //先把油门打到最低,即高电平为1ms
delay_ms(1800);//等待电机确认
delay_ms(1800);
delay_ms(1800);
delay_ms(1800);
delay_ms(1800);
delay_ms(1800);
delay_ms(1800);
delay_ms(1800);
TIM_SetCompare1(TIM2,1800); //再把高电平时间设为1~2ms
TIM_SetCompare2(TIM2,1800);
TIM_SetCompare3(TIM2,1800);
TIM_SetCompare4(TIM2,1800);
之前做过T形马达的小车,是通过pwm波控制小车速度,四轴飞行器的无刷电机也差不多。控制方法如下所述
控制频率
我的电调控制频率(pwm波的频率)50Hz就ok了。有的电调可能要500Hz或者其它的数值
所谓油门
油门就是pwm波的高电平持续时间(也可能是指占空比,over)
控制方法
第一次启动设置行程
先让控制器输出50Hz(T=20ms),高电平时间为2ms的pwm波,然后给电调上电。持续这个波一会儿到提示音响起。搞不清楚各种提示音的话就估摸着2、3s就行了。
然后立即让控制器输出50Hz,高电平时间为1ms的pwm波,持续一会儿到提示音响起。这个时候你可以断电了。
正常情况下启动电机
先让控制器输出50Hz,高电平持续时间为1ms的pwm波,然后给电调上电。持续一会儿听到提示音后,把高电平时间调为1~2ms之间,电机就启动了。