[STM32F1] STM32F103C8T6定时器&PWM应用编程

[复制链接]
5073|51
 楼主| xiaoqi000 发表于 2024-1-29 16:48 | 显示全部楼层
五、采集PWM输出信号,获得其周期和脉宽,并重定向输出到串口显示
1)使用HAL库建立工程
2)选择的单片机型号
6115865b766448e019.png
 楼主| xiaoqi000 发表于 2024-1-29 16:48 | 显示全部楼层
3)配置RCC
9831465b7665392dc6.png
 楼主| xiaoqi000 发表于 2024-1-29 16:48 | 显示全部楼层
4)配置SYS

4882065b766616d5e1.png
 楼主| xiaoqi000 发表于 2024-1-29 16:48 | 显示全部楼层
5)
单片机端口配置使用

6419065b7666ddc7ee.png
 楼主| xiaoqi000 发表于 2024-1-29 16:49 | 显示全部楼层
6)串口通信配置,如下图所示
2250065b7667bafb1a.png
 楼主| xiaoqi000 发表于 2024-1-29 16:49 | 显示全部楼层
7)定时器定时配置(TIM2),按照图中步骤进行配置即可

5419065b766910b0ad.png
 楼主| xiaoqi000 发表于 2024-1-29 16:49 | 显示全部楼层
 楼主| xiaoqi000 发表于 2024-1-29 16:49 | 显示全部楼层
8)PWM波形捕获(TIM1),按照图中步骤进行配置即可
6344765b766ae2065e.png
 楼主| xiaoqi000 发表于 2024-1-29 16:50 | 显示全部楼层
 楼主| xiaoqi000 发表于 2024-1-29 16:50 | 显示全部楼层
代码:
#include "main.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"

uint8_t i = 0;

float Duty = 0;
float Frequency = 0;
uint16_t Cap_val1 = 0;
uint16_t Cap_val2 = 0;

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_TIM1_Init();
    MX_TIM3_Init();
    MX_USART1_UART_Init();
    MX_TIM2_Init();
    /* USER CODE BEGIN WHILE */

    printf("串口通信测试\r\n");
    HAL_TIM_Base_Start_IT(&htim2); // 使能定时器及其更新中断
    HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); // 使能定时器及其PWM输出
    HAL_TIM_IC_Start_IT(&htim1, TIM_CHANNEL_1);       // 使能定时器及其输入捕获
    HAL_TIM_IC_Start_IT(&htim1, TIM_CHANNEL_2);       // 使能定时器及其输入捕获
    __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 10); // 设置一个PWM波形进行测量

    while (1)
    {
        // 串口发送 频率 占空比
        printf("Cap_val1 is :%d ,  Cap_val2 is : %d \r\n", Cap_val1, Cap_val2);
        printf("Duty is :%0.2f%% Frequency is : %0.2f ms\r\n", Duty, Frequency);
        HAL_Delay(1000);
    }
}


// 定时TIM2 定时亮灯的中断函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *tim)
{
    if (tim == &htim2)
    {
        HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
    }
}

// 定时输入捕获回调函数 计算占空比和频率
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM1)
    {
        if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
        {
            Cap_val1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
        }
        if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
        {
            Cap_val2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);
            Duty = 100 - (float)Cap_val2 / (float)Cap_val1 * 100;
            Frequency = 0.001 * Cap_val1;
        }
    }
}

 楼主| xiaoqi000 发表于 2024-1-29 16:50 | 显示全部楼层
烧录运行结果
312965b766cf1575f.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部