- 博客(18)
- 收藏
- 关注
原创 【STM32标准库江协】软件I2C读取MPU6050
配置完基本的硬件电路就,MPU内部就自动开始转换了,然后就会把值放到寄存器里,我们读寄存器的值就行了。所以先将DataH<<8左移八位,如10110000<<8 = 10110000 00000000。其实就是超级大拼接,把之前I2C的从机地址和寄存器地址,改成MPU6050的了。DataH是高八位,DataL是低八位,因为总共是16位的数据。再或上低八位DataL,如 = 00100010。最后在main.c里这么用,用指针就行了。读取xyz加速度角速度每个参数。
2025-12-01 17:34:41
297
原创 【STM32标准库江协】软件I2C
由于并没有指定地址读,所以所谓的指定地址读,是指定地址写+当前地址读,指定地址写一半我们不写数据,目的是让这个指针自动挪到目标位置,由于当前地址读就是读的这个指针,然后,具体的软件I2C代码怎么写的也不用特意去研究,大概知道就好了,毕竟这个是开源的,那么多协议总不能一个个都去了解,会用就好。每写入一次或者读出一次,这个指针的值都会更新,当前地址读的当前地址就是目前指针所指向的地址,因为有指针,所以也不用特意指定。指定地址写的前半部分【起始位,寄存器地址+应答位】+当前地址读的【起始位,结束位】(全部)
2025-12-01 17:34:16
248
原创 【STM32标准库江协】ADC
不断的初始化,相当于不断的把不同的通道放到Rank1的位置,Rank1的位置始终是变化的,所以我们可以实现这样的用一个Rank采集多个通道的效果。所谓序列1就是Rank1,通道2就是Channel_2,想换一个通道的话就在Rank1里把Channel_2改成Channel_1。这其中的AD_GetValue传入的参数虽然看上去是个字符串,但是是被宏定义了,实际上传入的是一个整型数字。校准是固定代码,实在要改就把ADC1改成ADC2就行了,然后这段代码一般是在ADC开启后。然后我们在自己写的函数里。
2025-11-28 11:02:10
247
原创 【STM32标准库江协】定时器的编码器接口
编码器接口就是借用了,输入捕获TI1FP1和TI2FP2,注意是CH1的directTI和CH2的directTI才是TI1FP1和TI2FP2,不是单纯的CH1和CH2。//本来下面还有的,但是与编码器接口无关就直接删掉了,就是直连通道那块,极性选择那块也删了,删不删也无所谓,只是因为重复配置了,编码器那个函数也能配置。这里的编码器接口其实是只要有跳变电平,不管是上升沿还是下降沿都计数的。然后编码器接口右边没图了,实际上是编码器接口控制的是。极性选择,之前的极性选择类似于,上升沿触发然后计数。
2025-11-28 11:01:55
255
原创 【STM32标准库江协】PWMI测量占空比
选择TI1FP1表示只在上升沿的时候清空CNT。但是ST公司给我们封装好了,用下面那个就好了。然后选directTI就是去往ccr1。channel1就是ch1引脚进来的。选IndirectTI就是去ccr2。这个是就自动给TI1FP2直连上升沿。这个就自动给TI1FP2交叉下降沿。这个是测试函数,ccr2/ccr1。意思是,如果通道1是直连上升沿。如果TI1FP1是交叉下降沿。反正会两个参数都配置成相反的。然后TI1FP2捕获下降沿。channel2就是ch2。原本代码是这个样子的。
2025-11-27 17:23:59
451
原创 【STM32标准库江协】输入捕获测频率
因为一直增加的是CNT的值,然后如果频率不变CCR的值也是不变的,因为CNT的值直到上升沿才被下载到CCR一次,CCR在下载之前也是那个值,所以CCR也是不变的。如果要测量PWM,可以用CCR1捕获上升沿用CCR2捕获下降沿,然后用CCR2/CCR1就是占空比。这里的从是,定时器作为从,被其他控制,如来了上升沿控制,就清空CNT的值。检测到上升沿或者下降沿这种电平跳变,就会产生动作,和外部中断差不多哈。这里触发源选TI1FP1,然后模式选RESET就可以清空CNT的值了。注意这是从模式的,主模式是这个。
2025-11-27 17:23:51
303
原创 【STM32标准库江协】PWM
是给下面的参数先设置一个初始值。所以对于一个定时器的一个通道来说,输入和输出比较不能同时用哈,这是固定引脚对应表。注意,TIM的输入比较引脚和输出比较引脚都是一样的,同一个通道也都用一个寄存器。其实相比于之前的时基单元配置,也就多了个通道配置,OC1INIT。再下面CCR的值也没什么好说的,就是先给CCR设定个初始值。这个是选择高极性,其实与其说高极性不如说极性不反转。如果选择低极性,就输出完全相反的PWM波形。这个是PWM1模式,也没什么好说的。下面ENABLE使能没什么好说的。
2025-11-26 12:40:41
436
原创 【STM32标准库江协】ITR外部时钟源计数
再开启即可,TIM_EXTRGPSC_OFF是不分频,TIM_EXTTRGPOLARITY是极性选择,0x00是滤波器的采样频率也别管了。可以采用浮空输入和上拉输入,这里用的上拉输入保持稳定,如果是浮空输入的话。会自动绑定该GPIO引脚作为时钟源,注意,每个TIM的ITR引脚是固定的。就是靠感应GPIO输入的信号跳变如上升下降沿,来作为时钟源。所以我们这次用的PA0,就正好是TIM2的。只需要先配置好GPIO的INIT。建议在较小的那种波动下使用。
2025-11-26 12:40:19
327
原创 【STM32标准库江协】TIM定时器触发中断
当定时器溢出的时候不是会产生一个更新事件吗,我们把这个更新事件映射到TRGO就可以触发DAC转换了,转换的频率就是定时器的溢出频率,而且还是硬件自动化,不需要别的了。注意连接的总线也不一样,高级定时器连接APB2总线速度比较高,在RCC开启时钟的时候注意。这个向上的箭头代表的是中断信号,然后我们只要配置好NVIC的定时器通道就好了。5高级定时器才有的,通用定时器设置成0就行了,作用也就相当于再分频一次。当定时器溢出的时候,会有两个信号,一个中断,一个事件。我们定时中断就先用内部时钟。中断函数名字依旧固定。
2025-11-25 16:54:52
553
原创 【STM32标准库江协】AFIO+EXTI对射式红外传感器计次(外部触发中断)
优先级分组:分组的话,一个芯片只能用一次,注意分组和优先级设置不同,分组是设置整个芯片的,优先级是设置某个外设某个通道的,优先级越小资历越高。NVIC相当于一个排队系统,把某个模块某个通道当作一个病人,排队,不过这个排队并不公平,不是先来后到,是按照优先级,看资历的。第一个通道:因为我们选择的是14通道EXTI进来的,触发的NVIC中断,每个通道对应一个中断相应函数。NVIC住皇宫里的,也不用打开,因为是内核的外设,内核的外设不用开启时钟,RCC管的是内核外的外设。引脚数量肯定大于16。
2025-11-25 16:06:05
933
原创 【HAL库传感器专栏】HC-SR04超声波模块
/@注意:频率我设置的是8MHZ,然后CNT更新的值并不是8/PSC/ARR,那是溢出的值,CNT更新的值是8/PSC。//还有一个注意的点是在写trig代码的时候,延时的时间是us不是ms,注意是微秒延时,不是毫秒。//我们将psc的值设置成7,arr的值越大越好防止溢出,所以我们的cnt更新频率是1us。//然后引脚的话,trig引脚设置的是推挽输出,echo引脚设置的是下拉输入。代码:这个函数的作用是返回以米为单位的distance。
2025-11-23 19:33:24
626
5
原创 【HAL库传感器专栏】矩阵键盘
就先初始化每一行为低电平,列的引脚为高电平,然后按下了,线也就接上了,接上了就是对应列的引脚也是低电平,因为一开始列的引脚是高电平,所以产生变化所以就能判断哪个按下了。长相:其中C的意思是Column,即列 R的意思是Row,即行。调用这个函数,按下哪个按键返回这个按键的标号。具体要改引脚在.h文件的define里改。
2025-11-22 21:47:01
225
原创 使用HAL库开发铁头山羊平衡车之测量减速比+M法测速,深入解析M法测速不适用于本次平衡车的原因
要探讨测频法,就先要探讨为什么要测频法,测频法的目的是为了测速度,这里速度是指瞬时速度,测频法怎么测瞬时速度呢,测频法是在一段固定时间内,测量变化的数量,即时间Δt固定,去测这段时间内的ΔM,然后当这个Δt非常小的时候,就可以近似理解为瞬时速度,此时的速度,瞬时速度,就是Speed = ΔM / Δt,距离除以时间。由于我们手动转动的速度太慢(连极端情况都算不上),所以会出现,在encoder没变化的时候,我们的角速度就在以1ms一次的速度计算了,所以会仅仅在一个未产生变化的边沿,计算多次。
2025-11-21 22:06:17
546
原创 使用HAL库开发铁头山羊平衡车编码器篇
(使用此中断函数的时候,仅需在.h文件中声明一下,不用在main函数里提前声明之类的,触发中断的时候会自动跳转到此中断函数,标准库里的中断函数需要对标志位清零,HAL库很方便不用)中断与gpioread不同,同样一段脉冲信号,gpioread捕捉的是此时的高低电平信号,中断捕捉的是高低电平变化的信号,下图红色的是中断捕捉的,蓝色的gpioread捕捉的。假如来了一个上升沿,此时会进入中断函数,然后这个发生时间是有先后顺序的,是先有上升沿,然后再进入中断,通过读取A和B的脉冲,来判断正转反转以及位置。
2025-11-20 11:51:35
746
原创 使用HAL库开发铁头山羊平衡车之电机调速代码(2) 对PWM的理解
定时器通过输出比较通道,来不断比较CNT寄存器的值与CCR寄存器的值,输出一段方波信号,在常用的PWM1下且向上计数,如果CNT的值小于CCR的值,那么输出高电平,否则输出高电平,所以占空比比的公式是:占空比 = CCR / (ARR + 1)本次实验如果采用百分比且整数的情况如50%,ARR的值设置成99和999并无区别,如果采用百分比且一位小数的情况如50.1%,显然ARR的值设置成999的时候,控制PWM的精度更高。先说结论:PWM的周期越短越好(但是也不能太高,会有别的影响如开关损耗,电磁干扰)
2025-11-18 15:04:27
872
2
原创 使用HAL库开发铁头山羊平衡车之电机调速代码(1)
CubeMx部分:PA1----STBY 推挽输出,初始低电压PA11---Button 下拉电阻--→初始低电压STBY:用来控制tb6612或者说平衡车两个电机的开启和关闭
2025-11-17 21:39:49
863
原创 使用HAL库开发铁头山羊平衡车,裸机多任务系统理解及电源指示灯
羊哥的delay函数可以保证吧时间切片到几us,适用于逻辑多任务模型,由于羊哥的delay函数是自己编写的且为标准库,这里用HAL库不太方便,于是我自己写了一个方便大家复制(其实主要是AI的功劳)但是delay函数会大大阻塞我们的运行时间,由于要适配逻辑多任务模型切片时间短的需求,这里就不能使用delay函数了。// 处理在读取ms和us之间,HAL_GetTick()刚好溢出(+1)的情况。// 如果当前CYCCNT的计数值很小,但ms却比上次大很多,说明发生了溢出。
2025-11-17 12:57:17
659
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅