对于小车的移动的话,因为我用的是三轮底板,因此只需要操控2个直流电机,所以就只用到两路PWM;
话不多说,先上代码;
move.c
#include "delay.h" #include "move.h" void MOVE_Init(u16 arr,u16 psc)//IO口,定时器,调制PWM输出 { RCC->APB1ENR |=1<<0;//TIM2时钟使能 RCC->APB2ENR |=1<<2; RCC->APB2ENR |=1<<4; GPIOA->CRL &=0XFFFF00FF;//PA2,3复用输出 GPIOA->CRL |=0X0000BB00; GPIOA->CRH &=0XF0F00FFF;//PA11~12推挽输出 GPIOA->CRH |=0X03033000; GPIOC->CRL &=0X00FFFFFF;//PC6~7推挽输出 GPIOC->CRL |=0X33000000; TIM2->ARR=arr;//自动重装载值 TIM2->PSC=psc;//预分频系数 TIM2->CCMR2|=7<<4; //CH3 PWM2 模式//比较捕获模式配置寄存器 TIM2->CCER|=1<<8; //输出使能 //捕获/比较使能寄存器 TIM2->CCMR2|=7<<12; //CH4 PWM2 模式//比较捕获模式配置寄存器 TIM2->CCER|=1<<12; //输出使能 //捕获/比较使能寄存器 TIM2->CR1 |=0X0001;//使能定时器2 } void right(int time)//右转 { //left IN1=0; IN2=0; //right IN3=0; IN4=1; delay_ms(time); } void left(int time)//左转 { //left IN1=0; IN2=1; //right IN3=0; IN4=0; delay_ms(time); } void back(int time)//后退 { //left IN1=1; IN2=0; //right IN3=1; IN4=0; delay_ms(time); } void go(int time)//前进 { //left IN1=0; IN2=1; //right IN3=0; IN4=1; delay_ms(time); } void stop()//停止 { IN1=0; IN2=0; IN3=0; IN4=0; delay_ms(10); }move.h
#ifndef _MOVE_H_ #define _MOVE_H_ #include "sys.h" #define leftmotor PAout(2) #define IN1 PAout(11) #define IN2 PAout(14) #define rightmotor PAout(3) #define IN3 PCout(6) #define IN4 PCout(7) #define left_PWM TIM2->CCR3//占空比 #define right_PWM TIM2->CCR4//占空比 void MOVE_Init(u16 arr,u16 psc); void left(int time); void right(int time); void go(int time); void back(int time); void stop(void); #endif1–代码比较简单,主要说一下PWM的频率,占空比和电机的关系; 先说占空比,对于直流电机的话,从宏观上看,就是相当于把输入电压打个折扣后输出,例如输入电压5V,设置占空比50%,那么输出电压就变成了2.5V了,我们都知道加在直流电机外的电压越大,转速越快,因此在输入电压不变的情况下,可以通过改变改变PWM的占空比来改变输出电压,从而调节转速;(这里的输入输出是针对电机驱动芯片而言的); 再来看频率;频率越高,电机转动越流畅,但声音越尖锐;相反频率越低,点机转动月卡顿,声音会月低沉;虽说当频率高达一定程度时,人的耳朵就听不见这种声音了,而且电机转动也流畅,但这样就需要极大的占空比,留给我们可调节范围太窄,导致转速过快,无法控制; 总的来说,还是要看具体情况而定; 2–遇到的问题; 对于32来说,有些IO口是不能直接当普通IO口使用的,因为他是JTAG接口,使用前需要先禁用JTAG;我在这上面吃了很大亏,浪费了一下午时间,现在想起来总觉得那时有点傻;希望大家不会犯这个错误;选择IO口之前还是看下数据手册为好;