其他分享
首页 > 其他分享> > STM32双轴摇杆控制空心杯电机

STM32双轴摇杆控制空心杯电机

作者:互联网

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;
	}
}

示例效果

在这里插入图片描述
工程示例:

标签:1CR2,TIM3,电机,STM32,摇杆,双轴,PWM,u16
来源: https://blog.csdn.net/weixin_44453694/article/details/117633425