本文主要是介绍FOC--有感--clion,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
配置CLion用于STM32开发【优雅の嵌入式开发】 - 知乎
TIM1_CH3N是TIM1_CH3的互补输出通道。TIM1是一个高级定时器,具有互补输出功能。TIM1_CHx是PWM的主通道,而TIM1_CHxN则是PWM的互补输出通道。
开漏输出和推挽输出:
输出电平能力:
推挽输出:可以输出高电平和低电平。当推挽输出的一个GPIO引脚输出高电平时,该引脚会通过一个上拉电阻连接到VCC(电源电压),从而输出高电平;当输出低电平时,该引脚会通过下拉电阻连接到GND(地),从而输出低电平。
开漏输出:只能输出低电平,无法真正输出高电平。当开漏输出的GPIO引脚需要输出高电平时,它不会直接连接到VCC,而是需要借助外部的上拉电阻来将电平拉高到VCC。因此,开漏输出需要外部电路的支持才能实现高电平输出。
电路结构:
推挽输出:推挽输出的电路结构通常包括一对互补的MOSFET(金属氧化物半导体场效应晶体管),其中一个MOSFET用于输出高电平,另一个用于输出低电平。当输出高电平时,上拉MOSFET导通,下拉MOSFET截止;当输出低电平时,上拉MOSFET截止,下拉MOSFET导通。
开漏输出:开漏输出的电路结构通常只包括一个N沟道的MOSFET,用于输出低电平。当需要输出高电平时,MOSFET截止,需要外部上拉电阻将电平拉高到VCC。
推挽输出不考虑外部电路可以输出高低电平,开漏输出若想输出高电平则需要在外部电路中使用上拉电阻。
HAL库的灵魂是句柄,通过设置一系列的句柄和结构体来集成。
获取u ,v,w三相电流其实仅需要获取任意两项电流即可,剩余的一项可以根据基尔霍夫电流定律获得。
motor->ib 通常表示一个结构体或类的指针成员访问。这里的 -> 符号用于通过结构体或类的指针访问其成员。下图中函数中的motor是值函数形参的foc_data *motor
使用HAL库开发STM32:ADC基础使用_hal_adc_start-CSDN博客
SPI配置,SPI_CSN为片选引脚。
clion通过配置config文件可以使用DAP,ST-link等多种下载器进行下载。
FOC全过程:
使Id的值为0,Iq的值为电机沿切线方向的有效控制量。
SVPWM即为6个MOS组成的全桥整流,只是在空间矢量角度对三相进行控制的,使三相的输出电压接近正弦波。共可以组合出8中矢量电压:
【STM32】Hal库学习——PWM驱动电机_hal_tim_pwm_start-CSDN博客
PWM频率计算公式 f = 定时器时钟频率 / [ (Period+1) *(Prescaler) ]= 72M / (7199+1) *1 = 10k HZ
USART的异步收发和同步收发的区别:(一般使用异步收发)
异步收发:在异步通信中,发送方发出数据后,不等接收方发回响应,接着发送下一个数据包的通讯方式。也就是说,发送方和接收方不需要共享一个时钟信号。异步通信的效率相对较低,因为需要在每个数据包前后添加额外的同步信息,如起始位、结束位和校验位等。此外,异步通信的双方时钟允许误差较大。同步收发:在同步通信中,发送方发出数据后,需要等待接收方发回响应以后才发下一个数据包的通讯方式。也就是说,发送方和接收方需要共享一个时钟信号,以协调数据的传输。同步通信的效率较高,因为只需要传输实际的数据,无需额外的同步信息。但是,同步通信的双方时钟允许误差较小。
static 关键字并不意味着变量的值永远不会改变。static 的主要作用是控制变量的生命周期和可见性,而不是其值的不变性。
生命周期:对于局部变量,static 关键字使得变量在程序的整个执行期间都存在,而不仅仅是在每次函数调用时。这意味着变量在函数调用之间会保持其值。对于全局或命名空间范围的变量,static 意味着该变量只在其定义的文件内可见。
可见性:static 关键字限制了变量的可见性。在文件作用域中,只有定义该变量的文件可以访问它。在函数作用域中,只有该函数的代码可以访问它。
值的不变性:static 关键字并不保证变量的值不变。变量的值是否改变取决于你如何编写代码。你可以像对待非静态变量一样修改静态变量的值。例如:
c复制代码
#include <stdio.h> | |
static int counter = 0; // 静态全局变量,初始化为0 | |
void incrementCounter() { | |
counter++; // 静态变量的值可以改变 | |
} | |
int main() { | |
printf("Initial counter value: %d\n", counter); | |
incrementCounter(); | |
printf("Counter value after increment: %d\n", counter); | |
return 0; | |
} |
在这个例子中,counter 是一个静态全局变量,并且它的值在 incrementCounter 函数中被递增了。因此,静态变量的值确实可以改变。如果你想要一个值永远不变的变量,你应该使用 const 关键字,而不是 static。const 关键字表示变量的值在初始化后不能被修改。例如:
c复制代码
const int constantValue = 42; // 常量,值不能改变 |
尝试修改 constantValue 的值将导致编译错误。
uint8_t是一个无符号8位整型数,其取值范围是从0到255。
uint32_t是无符号32位整型变量,其取值范围为0到4294967295
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);代码的意思是:将GPIOB在GPIO_PIN_0端口上的引脚重置(设置为低电平)。
HAL_SPI_Receive(&hspi1,(uint8_t *)&data_RX[0],1,1000); 使用配置好的hspi1 SPI接口,从SPI总线接收1个字节的数据,并将其存储在data_RX数组的第一个位置。如果在1秒内没有接收到数据,函数将超时并返回一个错误。
if (a == 1 || b == 1) ||表示或 ; if (a == 1 && b == 1) &&表示与 ; if(!a) !表示非
有符号的 16 位整数 short 类型的取值范围是从 -32,768 到 32,767。
switch (mode) {
case 1://速度变化
if(i>=0xfff) {
i=0
}break;
case 2://速度梯度变化
motor->iqPID.outMax=6.9f;
i++;
if(i>=0x2ff) {
i=0;
if (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_RESET) {
motor->tar_speed += 0.1f;
} ;
}
break;
HAL_UART_Receive_IT(&huart3, (uint8_t *)Buffer, 1);初始化UART3模块以通过中断方式接收1字节的数据,并将该数据存储在Buffer中。当UART3接收到数据时,将触发一个中断,然后可以在相应的中断服务函数中处理接收到的数据。
void UART3_IRQHandler(void)
{
HAL_UART_IRQHandler(&huart3);
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART3)
{ // 处理接收到的数据
// Buffer[0] 现在包含接收到的字节
// ...
// 重新启动中断接收,如果需要的话
HAL_UART_Receive_IT(&huart3, (uint8_t *)Buffer, 1, HAL_MAX_DELAY);
}
}
// 在某个初始化函数中
HAL_UART_Receive_IT(&huart3, (uint8_t *)Buffer, 1, HAL_MAX_DELAY);
结构体中的struct:结构体中定义结构体,以及结构体中结构体的使用:
直流有刷电机选型时候关心的参数:
在PCB设计中,"VBUS" 通常表示一个电源总线,特别是当它用于USB或其他类似的接口标准时
多层PCB设计过程中内层的信号线层通常选用正片层,并且也许铺铜处理。
永磁同步电机是一种利用永磁体产生磁场的同步电机,具有高效率、高功率因数、良好的起动性能等特点。而伺服电机则是一种能够精确控制位置、速度和加速度的电动机,广泛应用于需要高精度和高性能控制的机械设备中。
实际上,永磁同步电机可以被视为伺服电机的一种类型。伺服电机通常包括交流伺服电机和直流伺服电机,其中交流伺服电机又可以分为同步型和异步型。而永磁同步电机则属于同步型交流伺服电机的一种。
永磁电机里,为什么电动车上永磁同步电机居多,无人机上直流无刷电机居多?这两个电机类型可以互相替代吗?
永磁电机采用正弦波控制,扭矩更大;
链接:https://github.com/ohBrooks/MY_FOC_Driver
这篇关于FOC--有感--clion的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!