STM32双轴摇杆控制空心杯电机
双轴摇杆传感器
PS2双轴按键游戏摇杆模块采用PS2游戏手柄上金属按键摇杆电位器、模块特设二路模拟输出和一路数字输出接口、输出值分别对应(×、Y双轴偏移量、其类型为模拟量、按键表示用户是否在z轴上按下、其类型为数字开关量、模块集成电源指示灯、可显示工作状态、坐标标识符清晰简明、准确定位、用其可以轻松控制物体(如二*度舵机云台)在二维空间运动、因此可以通控制器编程、传感器扩展板插接、完成具有创意性遥控互动作品。
硬件接口:
GND – GND
+5V – +5v
VRX – x方向模拟量
VRY – y方向模拟量
SW --按键状态
720空心杯电机
空心杯电机转速快,体积小,搭配螺旋桨适合用于遥控器飞机模型制作DIY电子科技制作,接线简单,是做微型四轴飞行器的配件。使用简单:空心杯电机,钦铁硼强磁性能更稳定。
电机驱动模块
(1) MOS场效应管驱动模块采用原装进口双MOS并联有源输出,内阻更低,电流大,功率强,常温下15A,400W,满足了大多数设备的使用;
(2) 宽电压,支持PWM;1:工作电压:DC 5V–36V;
(3) 触发信号源:数字量高低电平(DC3.3v–20V),可以接单片机IO口,PLC接口,直流电源等,可以接PWM信号,信号频率0–20KHZ支持。
(4) 输出能力:直流DC 5V–36V,常温下持续电流15A,功率400W!辅助散热条件下,最大电流可达30A。
(5) 应用:输出端可以控制大功率的设备,电机,灯泡,LED灯带、直流马达、微型水泵、电磁阀等,可以输入PWM,控制电机转速,灯自亮度等。
软件设计
定时器3通道1(PA6)输出PWM波,完成电机控制
/*****************PWM波输出*****************
**形参:u16 psc -- 预分频系数
** u16 arr -- PWM一个周期时间
** u16 ccr -- 占空比
**例:Tim3_CH1_PWM(72,1000,200)
**PWM的周期时间:1000us
**占空比:200/1000*100%=20%
**高电平时间:200US,低电平时间为800us
*********************************************/
void Tim3_CH1_PWM(u16 psc,u16 arr,u16 ccr)
{
//1.开时钟
RCC->APB1ENR|=1<<1;//TIM3
RCC->APB1RSTR|=1<<1;//开复位时钟
RCC->APB1RSTR&=~(1<<1);//关复位
RCC->APB2ENR|=1<<2;//PA
/*2.配置GPIO口*/
GPIOA->CRL&=0xf0ffffff;
GPIOA->CRL|=0x0B000000;//复用推挽输出
/*3.配置核心寄存器*/
TIM3->CNT=0;//清空计数器中的值
TIM3->PSC=psc-1;//预分频系数
TIM3->ARR=arr;//重装载值
TIM3->CR1|=0x1<<7;//自动重装载预装载允许位
TIM3->CCMR1&=~(0x3<<0);//OC1配置为输出
TIM3->CCMR1|=0x1<<3;//输出比较1预装载使能
TIM3->CCMR1|=0x6<<4;//PWM模式1,CNT<CCR1为有效电平
TIM3->CCER&=~(1<<1);//有效电平为高电平
TIM3->CCR1=ccr;
TIM3->CCER|=1<<0;//输出使能
TIM3->CR1|=1<<0;//使能TIM3
}
ADC1规则通道采集遥控x轴模拟值
/****************ADC规则通道配置*******************
**
**硬件接口:PB0 --ADC1_CH8
**
*****************************************************/
void ADC_Regular_Channel(void)
{
/*1.开时钟*/
RCC->APB2ENR|=1<<3;//PB时钟
RCC->APB2ENR|=1<<9;//ADC1时钟
RCC->APB2RSTR|=1<<9;//ADC1复位
RCC->APB2RSTR&=~(1<<9);//取消复位
/*2.配置GPIO口*/
GPIOB->CRL&=0xFFFFFFF0;//配置为模拟输入
/*配置ADC工作频率*/
RCC->CFGR&=~(0x3<<14);//清除原来寄存器中的值
RCC->CFGR|=0x2<<14;//ADC工作频率:72MHZ/6=12MHZ
/*3.ADC核心寄存器配置*/
// ADC1->CR1&=~(0xF<<16);//独立模式
// ADC1->CR1&=~(1<<8);//关闭扫描模式
ADC1->CR2|=1<<23;//采集内部温度数据
ADC1->CR2|=1<<20;//使用外部事件启动转换
ADC1->CR2|=0x7<<17;//选择SWSTART事件转换通道
// ADC1->CR2&=~(1<<11);//右对齐
// ADC1->CR2|=1<<1;//连续转换模式
ADC1->SMPR1|=0x7<<18;//设置内部温度采样时间,通道16
ADC1->SMPR2|=0X7<<24;//通道8采样时间
ADC1->SQR1&=~(0xF<<20);//设置单次转换的通数量为1个
ADC1->CR2|=1<<0;//开启ADC
ADC1->CR2|=1<<3;//初始化校准寄存器
while(ADC1->CR2&1<<3);//等待初始化完成
ADC1->CR2|=1<<2;//开始校准
while(ADC1->CR2&1<<2);//等待校准完成
}
/*******************获取规则通道转换*****************
**
**形参:u8 chx ---需要转换的通道号(0~17)
**返回值:转换成功的数据(12位)
**
******************************************************/
u16 ADC1_GetRegular_Channel_Data(u8 chx)
{
u16 dat;
ADC1->SQR3&=~(0x1F<<0*5);//清除第一转换序列中的值
ADC1->SQR3|=chx<<0*5;//设置需要转换的通道号
ADC1->CR2|=1<<22;//开启转换规则通道
while(!(ADC1->SR&1<<1)){}//等待规则通道转换完成
dat=ADC1->DR;
return dat;
}
主函数
int main()
{
int data=0;
float data2=0;
Usartx_Init(USART1,115200,72);
TIMx_Init(TIM2,72,20*1000);
TIM3_CHx_PWM(1,3600,data);//1屏,周期50ms(20khz)
ADC_Regular_Channel();//规则通道初始化
while(1)
{
data=ADC1_GetRegular_Channel_Data(8);//完成规则通道转换
data-=2054;
data2=data*1.0/4095*3600;
TIM3->CCR1=data2;
}
}
示例效果
工程示例: