PS2双轴按键游戏摇杆模块采用PS2游戏手柄上金属按键摇杆电位器、模块特设二路模拟输出和一路数字输出接口、输出值分别对应(×、Y双轴偏移量、其类型为模拟量、按键表示用户是否在z轴上按下、其类型为数字开关量、模块集成电源指示灯、可显示工作状态、坐标标识符清晰简明、准确定位、用其可以轻松控制物体(如二自由度舵机云台)在二维空间运动、因此可以通控制器编程、传感器扩展板插接、完成具有创意性遥控互动作品。
硬件接口:
GND – GND
+5V – +5v
VRX – x方向模拟量
VRY – y方向模拟量
SW --按键状态
空心杯电机转速快,体积小,搭配螺旋桨适合用于遥控器飞机模型制作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):冲宽度调制是一种模拟控制方式,根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。广泛应用在从测量、通信到功率控制与变换的许多领域中。
脉冲宽度调制(PWM)是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。
STM32芯片本身自带PWM模式,该模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。在TIMx_CCMRx寄存器中的OCxM位写入’110’(PWM模式1)或’111’(PWM模式2),能够独立地设置每个OCx输出通道产生一路PWM。必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器,最后还要设置TIMx_CR1 寄存器的ARPE位, (在向上计数或中心对称模式中)使能自动重装载的预装载寄存器。仅当发生一个更新事件的时候,预装载寄存器才能被传送到影子寄存器,因此在计数器开始计数之前,必须通过设置TIMx_EGR寄存器中的UG位来初始化所有的寄存器。OCx的极性可以通过软件在TIMx_CCER寄存器中的CCxP位设置,它可以设置为高电平有效或低电平有效。 TIMx_CCER寄存器中的CCxE位控制OCx输出使能。
1.配置定时器基本功能(定时器基本功能,设置预分频系统,设置周期时间)---》2.设置定时器PWM模式(PWM1模式1和PWM1模式2) ---》3.设置占空比---》4.设置占空比---》5.开启定时器;
/*****************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,CNTCCER&=~(1<<1);//有效电平为高电平
TIM3->CCR1=ccr;
TIM3->CCER|=1<<0;//输出使能
TIM3->CR1|=1<<0;//使能TIM3
}
为有效电平>
STM32本身自带ADC功能,有两个12位的ADC。一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。 ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。
● 12位分辨率
● 转换结束、注入转换结束和发生模拟看门狗事件时产生中断
● 单次和连续转换模式
● 从通道0到通道n的自动扫描模式
● 自校准
● 带内嵌数据一致性的数据对齐
● 采样间隔可以按通道分别编程
● 规则转换和注入转换均有外部触发选项
● 间断模式
● 双重模式(带2个或以上ADC的器件)
/****************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;
}
}
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !