yzq1998 发表于 2024-11-1 17:39

PWM调速

请问凌鸥有做过PWM调速的例程吗?求!!!小白一枚,自己写又费时间又容易出错

JZLLOVEHA 发表于 2024-11-1 18:22

凌鸥有MCPWM例程,差不多的

xionghaoyun 发表于 2024-11-2 09:23

1.例程 2.不会就模拟PWN

丙丁先生 发表于 2024-11-3 17:24

您好,根据搜索结果,凌鸥确实有做过PWM调速的例程。以下是一段基于凌鸥LKS MCU的PWM调速代码和思路:

### 代码实现
```c
#include "lks_mcu.h"// 凌鸥LKS MCU的库文件
#include "pwm.h"   // PWM驱动库
#include "motor_control.h"// 电机控制模块
#include "hall_sensor.h"// 霍尔传感器模块
#include "current_monitor.h"// 电流检测模块

#define MAX_SPEED 1000// 最大转速
#define MIN_SPEED 100   // 最小转速
#define OVERLOAD_THRESHOLD 15// 电流过载阈值

void initSystem();// 系统初始化函数
void setMotorSpeed(int speed); // 设置电机转速
void setMotorDirection(int direction); // 设置电机方向
void stopMotor();// 停止电机
void overloadProtection();// 过载保护函数

int main(void) {
    initSystem();// 初始化系统
    setMotorSpeed(800);// 设置初始转速
    setMotorDirection(1);// 设置电机正转方向

    while (1) {
      if (CurrentMonitor_Read() > OVERLOAD_THRESHOLD) {
            overloadProtection();// 电机过载保护
      }
      // 其他逻辑
    }
}

// 系统初始化
void initSystem() {
    LKS_Init();// 初始化MCU
    // 其他初始化代码
}

// 设置电机转速
void setMotorSpeed(int speed) {
    if (speed < MIN_SPEED) speed = MIN_SPEED;
    if (speed > MAX_SPEED) speed = MAX_SPEED;
    // 设置PWM信号的占空比来控制电机转速
    // 具体代码依赖于PWM驱动库的实现
}

// 设置电机方向
void setMotorDirection(int direction) {
    // 根据direction参数设置电机转动方向
    // 具体代码依赖于电机控制模块的实现
}

// 停止电机
void stopMotor() {
    // 停止PWM信号输出,使电机停止
    // 具体代码依赖于PWM驱动库的实现
}

// 过载保护函数
void overloadProtection() {
    // 检测到过载时,停止电机并执行保护措施
    stopMotor();
    // 其他保护措施
}
```
### 思路说明
1. **初始化系统**:包括初始化MCU和相关的PWM、电机控制、霍尔传感器和电流检测模块。
2. **设置电机转速**:通过调整PWM信号的占空比来控制电机的转速。占空比越高,电机转速越快。
3. **设置电机方向**:根据需要设置电机的转动方向。
4. **过载保护**:通过电流检测模块监测电机的运行电流,一旦超过设定的阈值,执行过载保护,停止电机并执行其他保护措施。
5. **主循环**:在主循环中,持续监测电流情况,必要时执行过载保护。

希望这段代码和思路对您有所帮助。如果您有任何疑问或需要进一步的帮助,请随时告诉我。

玉树临风小黑龙 发表于 2024-11-4 15:50

官网上模块例程中有PWM捕获例程

丙丁先生 发表于 2024-11-4 22:19

根据您的需求,您想要了解如何通过单通道捕获模式来计算PWM的占空比,并希望得到这部分代码的大致写法。以下是根据搜索结果提供的代码示例,您可以根据这个示例来编写您的代码。

### 单通道捕获模式计算PWM占空比的代码示例

```c
#include "main.h"
#include "tim.h"
#include "usart.h"

volatile float PWM_Freq = 0.0; // PWM频率
volatile float PWM_Duty = 0.0; // PWM占空比
volatile uint32_t high_time = 0; // 高电平时间
volatile uint32_t low_time = 0; // 低电平时间
volatile uint8_t capture_state = 0; // 捕获状态

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
    if(htim->Instance == TIMx) // 替换为实际的定时器名称
    {
      if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) // 假设使用的是通道1
      {
            if(capture_state == 0) // 上升沿捕获
            {
                high_time = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
                capture_state = 1;
            }
            else if(capture_state == 1) // 下降沿捕获
            {
                low_time = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
                capture_state = 0;
               
                // 计算频率和占空比
                PWM_Freq = (float)SystemCoreClock / (__HAL_TIM_GET_AUTORELOAD(htim) + 1) / (high_time + low_time);
                PWM_Duty = (float)high_time / (high_time + low_time);
               
                // 可以在这里添加代码,将计算结果发送到串口或其他处理
            }
      }
    }
}

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_USARTx_UART_Init(); // 替换为实际的串口初始化函数
    MX_TIMx_Init(); // 替换为实际的定时器初始化函数

    HAL_TIM_IC_Start_IT(&htimx, TIM_CHANNEL_1); // 启动输入捕获中断

    while (1)
    {
      // 主循环代码,可以添加代码处理PWM_Freq和PWM_Duty
    }
}
```

### 代码解释

1. **变量定义**:定义了用于存储PWM频率、占空比、高电平和低电平时间的变量。
2. **中断回调函数**:在`HAL_TIM_IC_CaptureCallback`函数中,根据捕获的边沿(上升沿或下降沿)来更新计数器和标志位,并计算PWM的频率和占空比。
3. **主循环**:在主循环中,可以添加代码来处理计算得到的PWM频率和占空比,例如发送到串口或其他处理。

请注意,您需要根据实际的硬件配置和需求,替换代码中的`TIMx`、`SystemCoreClock`、`MX_USARTx_UART_Init`和`MX_TIMx_Init`等宏定义和函数名称。这个代码示例展示了如何使用STM32的HAL库来通过单通道捕获模式计算PWM的占空比。您可以根据您的具体硬件和需求进行相应的调整和优化。希望这个示例对您有所帮助!

丙丁先生 发表于 2024-11-4 22:22

您好,根据搜索结果,凌鸥确实有做过PWM调速的例程,并且支持HAL库。以下是一些相关信息:

1. **PWM调速例程**:在凌鸥的SDK中,`demos\peripheral\pwm`路径下提供了PWM例程。关键代码如下,展示了如何配置PWM的周期和占空比,以及如何使能和禁能PWM通道:
   ```c
   aw_pwm_config_t pwm_config;
   uint32_t period1 = 2000000; /* (ns) */
   uint32_t period2 = 1000000; /* (ns) */
   int fd;
   int ret;

   aw_kprintf("\nPWM demo testing...\n");
   fd = aw_open(CONFIG_DEMO_PWM_DEVICE_NAME, AW_O_RDWR, 0);
   if(fd < 0){
       aw_kprintf("pwm open failed \r\n");
       aw_close(fd);
       return 0;
   }
   ret = aw_pwm_config_get(fd, &pwm_config);
   /* period 配置不可以为0 duty配置为0,这时可以配置成功:输出一直为低 */
   /* duty配置为period,占空比为100%,也可配置成功:输出一直为高 */
   /* PWM正在进行输出,不可配置 */
   pwm_config.duty_ns = period1 / 2;
   pwm_config.is_inverse = 0;
   pwm_config.period_ns = period1;
   aw_pwm_config_set(fd, &pwm_config);
   while(1) {
       /* 配置 PWM 的有效时间(高电平时间)50% ,周期 period1*/
       aw_pwm_config_set(fd, &pwm_config);
       aw_pwm_enable(fd);
       /* 使能通道 */
       aw_mdelay(250);
       aw_pwm_disable(fd);
       /* 禁能通道 */
       aw_mdelay(250);
       /* 输出五个周期pwm波*/
       aw_pwm_accurate_output(fd, 5);

       /* 配置 PWM 的有效时间(高电平时间)2% ,周期 period2*/
       pwm_config.duty_ns = period2 / 50;
       aw_pwm_config_set(fd, &pwm_config);
       aw_pwm_enable(fd);
       /* 使能通道 */
       aw_mdelay(250);
       aw_pwm_disable(fd);
       /* 禁能通道 */
       aw_mdelay(250);
   }
   return 0;
   ```

2. **HAL库支持**:凌鸥的代码示例中包含了使用HAL库进行SPI、TIM和USART的初始化,这表明凌鸥支持HAL库。

以上信息应该可以帮助您了解凌鸥是否支持HAL库以及如何进行PWM调速。您可以根据提供的例程代码和HAL库的支持情况,进行相应的开发和调试。希望这些信息对您有所帮助!

elephant00 发表于 2024-11-7 11:36

凌鸥微的官方网站,查找其技术支持或下载中心区域,看是否有提供相关的例程或开发包。

两只袜子 发表于 2024-11-7 14:00

有时,购买凌鸥微的开发板或套件会附带相关的例程和文档

MYWX 发表于 2024-11-8 09:50

官网上有对应芯片的模块例程

chenjun89 发表于 2024-11-11 22:51

即使凌欧没有,其他板块也有相同的控制案例,找来看看便知。

丙丁先生 发表于 2024-11-14 09:24

先买开发板,然后找例程,都支持PWM的,通过Ai修改到可用的功能,就成了

Amazingxixixi 发表于 2024-11-21 11:13

PWM应该是有案例的。
页: [1]
查看完整版本: PWM调速