01 前言
原来做的差速小车是基于arduino控制的,感觉有些简单,也有些基础,arduino方便简单的同时,可操作性感觉也少了很多,所以想将控制器换成stm32,然后将树莓派作为上位机,stm32作为下位机,通过树莓派和stm32进行通讯,实现对差速移动小车的控制,本人也是寒假期间初学stm32,也是奔着应用去的,所以对于stm32编程原理方面可能不太精通,这里偏重于记录应用层面的知识。
02 pwm调速原理
直流电机驱动是最简单的,给电机通上电就能转,根据电机的公式:
可知:当提高电压时,反电势升高,进而转速升高,电压与转速大致有如图所示的关系。
编辑
所以我们只要控制给电机通电的电压即可控制电机的转速,但是在实际的控制中,控制直流电机需要通过h桥控制电机的正反转,如图,当t1和t4二极管导通时,有粉色通路;当t2和t3二极管导通时,有蓝色通路,这样我们就可以实现弱电控制强电,通过二极管的通断来控制电机的转向。
但是这样电机通电时电压就是us,我们如果想自由的控制us的电压值基本是不能实现的,因为电机是接到单片机的引脚上的,引脚的供电电压值是确定的,我们就要使用控制二极管的通断时间对电机的转速进行控制,即pwm控制。
图中的d1~d4二极管为续流的作用,因为电机中有绕组,在断电后,电感的电流不能瞬时变为0,所以在断电后电流沿棕色和绿色的通路放点电。
在一个周期内,我们通过控制通电的时间就可以调控平均电压,而平均电压的高低直接控制电机的转速,通电时间/周期,就可以得到占空比,我们也就是通过控制电机的占空比来控制电机的转速的。
在实际应用过程中,我们不用自己搭建h桥,而是使用电机驱动板(如:l298n)对直流电机进行驱动,l298n内搭载两个h桥电路,可以实现对两个电机的转向和转速进行控制。
这是淘宝商家提供的电机驱动板控制表,将in1~4接到单片机的引脚,我们就可以通过引脚输出pwm控制信号,对直流电机进行控制。
03 stm32编程实现
在stm32中如果想输出pwm信号,需要借助定时器,通过定时器的捕获/比较通道的pwm输出
当我们对定时器设置了预装载值arr和比较值ccr后,可以通过配置pwm模式,使定时器cnt计数值超过ccr后产生有效信号,并通过配置相应寄存器设置有效信号是1还是0,而配置pwm的输出方式,具体原理信息可以参考原子哥的视频,也可以参考中文参考手册的14.4.7内容。
在程序中,我们使用库函数进行配置,配置步骤如下:
使能定时器和相关外设引脚时钟 :rcc_apbxperiphclockcmd()配置io口为复用输出模式(查手册8.1.11)配置成相应的模式(复用推挽输出)初始化定时器:tim_timebaseinit()初始化tim2 channe1234 pwm模式:tim_ocxinit()使能ocx通道的预装载寄存器:tim_oc1preloadconfig()使能时钟:tim_cmd()在主函数中配置占空比进行调速:tim_setcompare1()#include sys.h/********************功能:通用时钟2用来产生通道1234四路pwm信号函数:tim2_pwm_init(u16 arr,u16 psc)作者:k.fire日期:2022.01.30引脚:pa0 pa1 pa2 pa3参数:arr:自动重装值 psc:时钟预分频数*****************/void tim2_pwm_init(u16 arr,u16 psc){ gpio_inittypedef gpio_initstructure; tim_timebaseinittypedef tim_timebasestructure; tim_ocinittypedef tim_ocinitstructure; //使能gpioa外设模块时钟 rcc_apb2periphclockcmd(rcc_apb2periph_gpioa, enable); //设置引脚为复用输出功能,输出tim2 ch1的pwm脉冲波形 gpioa.0 gpio_initstructure.gpio_pin = gpio_pin_0; //tim2_ch1 gpio_initstructure.gpio_mode = gpio_mode_af_pp; //复用推挽输出 gpio_initstructure.gpio_speed = gpio_speed_50mhz; gpio_init(gpioa, &gpio_initstructure);//初始化gpio //设置引脚为复用输出功能,输出tim2 ch2的pwm脉冲波形 gpioa.1 gpio_initstructure.gpio_pin = gpio_pin_1; //tim2_ch2 gpio_init(gpioa, &gpio_initstructure);//初始化gpio //设置引脚为复用输出功能,输出tim2 ch3的pwm脉冲波形 gpioa.2 gpio_initstructure.gpio_pin = gpio_pin_2; //tim2_ch3 gpio_init(gpioa, &gpio_initstructure);//初始化gpio //设置引脚为复用输出功能,输出tim2 ch4的pwm脉冲波形 gpioa.3 gpio_initstructure.gpio_pin = gpio_pin_3; //tim2_ch4 gpio_init(gpioa, &gpio_initstructure);//初始化gpio //使能定时器2时钟 rcc_apb1periphclockcmd(rcc_apb1periph_tim2, enable); //初始化tim2 tim_timebasestructure.tim_period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 tim_timebasestructure.tim_prescaler =psc; //设置用来作为timx时钟频率除数的预分频值 tim_timebasestructure.tim_clockdivision = 0; //设置时钟分割:tdts = tck_tim tim_timebasestructure.tim_countermode = tim_countermode_up; //tim向上计数模式 tim_timebaseinit(tim2, &tim_timebasestructure); //根据tim_timebaseinitstruct中指定的参数初始化timx的时间基数单位 //初始化tim2 channe1234 pwm模式 tim_ocinitstructure.tim_ocmode = tim_ocmode_pwm1; //选择定时器模式:tim脉冲宽度调制模式2 tim_ocinitstructure.tim_outputstate = tim_outputstate_enable; //比较输出使能 tim_ocinitstructure.tim_ocpolarity = tim_ocpolarity_high; //输出极性:tim输出比较极性高 tim_oc1init(tim2, &tim_ocinitstructure); //根据t指定的参数初始化外设tim2 oc1 tim_oc2init(tim2, &tim_ocinitstructure); //根据t指定的参数初始化外设tim2 oc2 tim_oc3init(tim2, &tim_ocinitstructure); //根据t指定的参数初始化外设tim2 oc3 tim_oc4init(tim2, &tim_ocinitstructure); //根据t指定的参数初始化外设tim2 oc4 tim_oc1preloadconfig(tim2, tim_ocpreload_enable); //使能tim2在ccr1上的预装载寄存器 tim_oc2preloadconfig(tim2, tim_ocpreload_enable); //使能tim2在ccr2上的预装载寄存器 tim_oc3preloadconfig(tim2, tim_ocpreload_enable); //使能tim2在ccr3上的预装载寄存器 tim_oc4preloadconfig(tim2, tim_ocpreload_enable); //使能tim2在ccr4上的预装载寄存器 tim_cmd(tim2, enable); //使能tim2}04 总结
原理部分我讲的很简略,我也是看原子哥的视频学,如果大家对单片机控制原理有学习需要,可以去b站看原子哥的视频,博主主要是做控制和上位机的,所以这部分只需要会用即可。
工业以太网的发展趋势 以太网在面向工业应用中的进化
数字农业气象站技术参数
SMT组装的各种生产流程
一加3/3T更新就绪 强调安卓8.0+面部识别
关于蒸汽回收机的介绍以及相关配套设备的选择
基于STM32F103C8T6+L298N通过PWM控制直流电机
80Gbps高速传输和240W的电力供应的USB Type-C®连接器
智能型测量控制系统电路设计攻略 —电路图天天读(168)
意法半导体CFO转任合资公司COO
libusb的嵌入式移植
AURA推监测心理的智能手表 利用生物识别传感器来检测用户心理健康
通过sysrq打印linux内核信息
什么是X电容和Y电容?
FPGA在微软云azure中的应用
MRAM实现了SPIEEPROM和SPIFlash组件通用的命令子集
音诺恒基于瑞芯微RV1109人脸识别主板方案面世
台联电25亿元山东建电厂 投资薄膜太阳能发电
Oracle Linux 8.7正式发布了GA版本
诺基亚7Plus和坚果Pro2哪个好
日本瑞萨电子拟以67亿美元收购美国芯片厂商IDT