发新帖我要提问
123
返回列表
打印
[STM32F1]

STM32F103C8T6定时器&PWM应用编程

[复制链接]
楼主: xiaoqi000
手机看帖
扫描二维码
随时随地手机跟帖
41
xiaoqi000|  楼主 | 2024-1-29 16:48 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
五、采集PWM输出信号,获得其周期和脉宽,并重定向输出到串口显示
1)使用HAL库建立工程
2)选择的单片机型号

使用特权

评论回复
42
xiaoqi000|  楼主 | 2024-1-29 16:48 | 只看该作者
3)配置RCC

使用特权

评论回复
43
xiaoqi000|  楼主 | 2024-1-29 16:48 | 只看该作者
4)配置SYS

使用特权

评论回复
44
xiaoqi000|  楼主 | 2024-1-29 16:48 | 只看该作者
5)
单片机端口配置使用

使用特权

评论回复
45
xiaoqi000|  楼主 | 2024-1-29 16:49 | 只看该作者
6)串口通信配置,如下图所示

使用特权

评论回复
46
xiaoqi000|  楼主 | 2024-1-29 16:49 | 只看该作者
7)定时器定时配置(TIM2),按照图中步骤进行配置即可

使用特权

评论回复
47
xiaoqi000|  楼主 | 2024-1-29 16:49 | 只看该作者

使用特权

评论回复
48
xiaoqi000|  楼主 | 2024-1-29 16:49 | 只看该作者
8)PWM波形捕获(TIM1),按照图中步骤进行配置即可

使用特权

评论回复
49
xiaoqi000|  楼主 | 2024-1-29 16:50 | 只看该作者

使用特权

评论回复
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;
        }
    }
}

使用特权

评论回复
51
xiaoqi000|  楼主 | 2024-1-29 16:50 | 只看该作者
烧录运行结果

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则