1.数模转换与模数转换(粗略):
对于常见的硬件adc来说:常见的模块有光敏模块,温湿度模块等等,其输出结果就是将所测变化的模拟量转化为高低电平的数字信号从而用电压来表示。(图片来自于up主keysking,很好的单片机教程up主)
而对于常规的模拟信号,数字信号的抗干扰性更好,所以我们如何用数字信号去模拟模拟信号呢?哒哒,这就要讨论到周期信号的占空比了,对于一个周期的数字信号来说,我们可以通过修改有效电平和无效占比的占比比例,从而让输出的期望电平位模拟信号的相对值。
从上面两个图像可以看出来了,当修改占空比的时候图像会发生畸变,同时一个周期的期望电压也会改变,数字信号发生畸变的原因是因为无效电平的占空比例过大,而拉高电压时不同与拉低电压,是一个需要时间的过程,所以我们这时候就要CH Polarity选择高速模式。如图:
cubemax配置(f103c8t6为例):
sys:
rcc
时钟拉满就好
TIM2
这里Prescaler的数值选择71,Counter Period的数值选择19999,要求周期的时间就是20ms。四个通道的配置都一致。(移植的朋友记得自己计算下)
Tout=(ARR+1)⋅(PSC+1)/TIMxCLK{20000X72➗72000000}
串口(这里用的是串口1)
命名并且生成。
sg90调试
可以看到,当有效电平为0.5ms时候,陀机为0°,以此类推,所以我们可以通过计算修改占空比和延迟来控制陀机
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);
#define angle1_0 __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,500);
#define angle1_45 __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,1000);
#define angle1_90 __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,1500);
#define angle1_135 __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,2000);
#define angle1_180 __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,2500);
int main(void)
{
while(1)
{
angle1_0;
HAL_Delay(1000);
angle1_45;
HAL_Delay(1000);
angle1_90;
HAL_Delay(1000);
angle1_135;
HAL_Delay(1000);
angle1_180;
HAL_Delay(1000);
}
}
步态
这里由于硬件原因只会说最简单的步态,这个东西其实不难,我们从俯视的角度来看,为4个脚分别标号,以下资料取材【步态详解】人人都可制作的WiFi遥控迷你四足机器人_哔哩哔哩_bilibili,很简单,建议跟着一步步做,延迟方面建议延迟150ms左右。当然如果担心会延迟冲突,我们可以新开一个tim来写一个自己的延迟函数
延迟
delay.c
// Core\Src\delay.c
#include "tim.h"
#include "delay.h"
/**
* @brief 微秒延时
* @param Delay_us —— 指定延迟时间长度,单位为微秒。
* @retval None
*/
void delay_us(uint32_t Delay_us)
{
__HAL_TIM_SetCounter(&htim1, 0);
__HAL_TIM_ENABLE(&htim1);
while(__HAL_TIM_GetCounter(&htim1) < Delay_us);
/* Disable the Peripheral */
__HAL_TIM_DISABLE(&htim1);
}
delay.h
// Core\Inc\delay.h
#ifndef __DELAY_H__
#define __DELAY_H__
//#include "stm32f4xx_hal.h"
#include "main.h"
#include "tim.h"
void delay_us(uint32_t Delay_us);
#endif /* __DELAY_H__ */