python 樹莓派版本,通俗表現原理。stm32 C語言版本在後面python
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()
/*********************************************** 功能:輸出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...\r\n"); } //下面是啓動方法 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)oop
先讓控制器輸出50Hz(T=20ms),高電平時間爲2ms的pwm波,而後給電調上電。持續這個波一下子到提示音響起。搞不清楚各類提示音的話就估摸着二、3s就好了。 而後當即讓控制器輸出50Hz,高電平時間爲1ms的pwm波,持續一下子到提示音響起。這個時候你能夠斷電了。ui
先讓控制器輸出50Hz,高電平持續時間爲1ms的pwm波,而後給電調上電。持續一下子聽到提示音後,把高電平時間調爲1~2ms之間,電機就啓動了。spa