野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10806|回复: 7

火哥,问你个PWM的周期和占空比的问题?

[复制链接]
发表于 2017-3-17 11:46:03 | 显示全部楼层 |阅读模式
如何根据串口命令改变PWM的周期和占空比

回复

使用道具 举报

发表于 2017-3-17 13:56:39 | 显示全部楼层
在pwm例程的基础上,把串口接收的定时器数据更新到pwm计数器就可以了,参考rgb彩灯例程
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-17 20:40:01 | 显示全部楼层
flyleaf 发表于 2017-3-17 13:56
在pwm例程的基础上,把串口接收的定时器数据更新到pwm计数器就可以了,参考rgb彩灯例程

#include "stm32f10x.h"
#include "bsp_led.h"
#include "bsp_usart1.h"
#include "bsp_AdvanceTim.h"

int main()
{
          uint8_t ch;
    //初始化USART 配置为模式115200 8-N-1,中断接收
          USARTx_Config();

          //高级定时器初始化
   General_TIM_GPIO_Config();
                        while(1)
                        {

                                ch = getchar();
                                printf("ch= %c \n",ch);

                                switch(ch)
                                {
                                        case '1' :General_TIM_Mode_Config(General_TIM_PERIOD1,General_TIM_PULSE1) ;

                                                        break;

                                        case '2' :General_TIM_Mode_Config(General_TIM_PERIOD2,General_TIM_PULSE2)                         ;
                                                        break;

                                        case '3' :General_TIM_Mode_Config(General_TIM_PERIOD3,General_TIM_PULSE3) ;
                                                        break;

                                        case '4' :General_TIM_Mode_Config(General_TIM_PERIOD4,General_TIM_PULSE4);
                                                        break;

                                        default:General_TIM_Mode_Config(General_TIM_PERIOD5,General_TIM_PULSE5);
                                                        break;
                                }
                        }                                       
}
#ifndef _BSP_ADVANCETIM_H
#define _BSP_ADVANCETIM_H

#include "stm32f10x.h"


#define General_TIM                                                                         TIM3
#define General_TIM_APBxClock_FUN                 RCC_APB1PeriphClockCmd
#define General_TIM_CLK                                                         RCC_APB1Periph_TIM3


// PWM 信号的频率 F = TIM_CLK/{(ARR+1)*(PSC+1)}
//PWM频率为100KHZ
#define General_TIM_PERIOD1                                           (80-1)
//PWM频率为200KHZ
#define General_TIM_PERIOD2                                           (40-1)
//PWM频率为500KHZ
#define General_TIM_PERIOD3                                           (16-1)
//PWM频率为1MHZ
#define General_TIM_PERIOD4                                           (8-1)
//PWM频率为2MHZ
#define General_TIM_PERIOD5                                           (4-1)

#define General_TIM_PSC                                                                 (9-1)
//频率为100KHZ,占空比为30%
#define General_TIM_PULSE1                                                   24
//频率为200KHZ,占空比为20%
#define General_TIM_PULSE2                                                          8
//频率为500KHZ,占空比为50%
#define General_TIM_PULSE3                           8
//频率为1MHZ,占空比为40%
#define General_TIM_PULSE4                                                          3.2
//频率为2MHZ,占空比为50%
#define General_TIM_PULSE5                                                          2

#define General_TIM_IRQ                                                         TIM3_UP_IRQn
#define General_TIM_IRQHandler                                 TIM3_UP_IRQHandler

        // TIM3 输出比较通道
#define General_TIM_CH1_GPIO_CLK                         RCC_APB2Periph_GPIOA
#define General_TIM_CH1_PORT                                         GPIOA
#define General_TIM_CH1_PIN                                          GPIO_Pin_6

//#define General_TIM_CH2_GPIO_CLK                         RCC_APB2Periph_GPIOA
//#define General_TIM_CH2_PORT                                         GPIOA
//#define General_TIM_CH2_PIN                                          GPIO_Pin_7

//#define General_TIM_CH3_GPIO_CLK                         RCC_APB2Periph_GPIOB
//#define General_TIM_CH3_PORT                                         GPIOB
//#define General_TIM_CH3_PIN                                          GPIO_Pin_0

//#define General_TIM_CH4_GPIO_CLK                         RCC_APB2Periph_GPIOB
//#define General_TIM_CH4_PORT                                         GPIOB
//#define General_TIM_CH4_PIN                                          GPIO_Pin_1

void  General_TIM_GPIO_Config(void);
void  General_TIM_Mode_Config(uint8_t General_TIM_PERIODx,uint8_t General_TIM_PULSEx);



#endif



#include "bsp_AdvanceTim.h"

//定时器复用功能引脚初始化
void        General_TIM_GPIO_Config(void)
{
                GPIO_InitTypeDef GPIO_InitStructure;

                // 输出比较通道 GPIO 初始化
                RCC_APB2PeriphClockCmd(General_TIM_CH1_GPIO_CLK, ENABLE);
                GPIO_InitStructure.GPIO_Pin = General_TIM_CH1_PIN;
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                GPIO_Init(General_TIM_CH1_PORT, &GPIO_InitStructure);

//          RCC_APB2PeriphClockCmd(General_TIM_CH2_GPIO_CLK, ENABLE);
//                GPIO_InitStructure.GPIO_Pin = General_TIM_CH2_PIN;
//                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
//                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//                GPIO_Init(General_TIM_CH2_PORT, &GPIO_InitStructure);
//       
//          RCC_APB2PeriphClockCmd(General_TIM_CH3_GPIO_CLK, ENABLE);
//                GPIO_InitStructure.GPIO_Pin = General_TIM_CH3_PIN;
//                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
//                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//                GPIO_Init(General_TIM_CH3_PORT, &GPIO_InitStructure);
//       
//          RCC_APB2PeriphClockCmd(General_TIM_CH4_GPIO_CLK, ENABLE);
//                GPIO_InitStructure.GPIO_Pin = General_TIM_CH4_PIN;
//                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
//                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//                GPIO_Init(General_TIM_CH4_PORT, &GPIO_InitStructure);

}       

//定时器模式配置
//C99支持任意地方定义变量,C11 这个是最新的C语言标准
void General_TIM_Mode_Config(uint8_t General_TIM_PERIODx,uint8_t General_TIM_PULSEx)
{
    // 开启定时器时钟,即内部时钟CK_INT=72M
                General_TIM_APBxClock_FUN(General_TIM_CLK,ENABLE);
/*--------------------时基结构体初始化-------------------------*/
          TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
          TIM_TimeBaseStructure.TIM_Period = General_TIM_PERIODx ;
    // 驱动CNT 计数器的时钟 = Fck_int/(psc+1)       
                TIM_TimeBaseStructure.TIM_Prescaler= General_TIM_PSC;
          TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
                // 计数器计数模式,设置为向上计数
                TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
    TIM_TimeBaseInit(General_TIM, &TIM_TimeBaseStructure);

                /*--------------------输出比较结构体初始化-------------------*/
                TIM_OCInitTypeDef TIM_OCInitStructure;
    // 配置为PWM 模式1
                TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
                // 输出使能
                TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
                // 设置占空比大小
                TIM_OCInitStructure.TIM_Pulse = General_TIM_PULSEx;
                // 输出通道电平极性配置
                TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
                //对输出通道初始化
                TIM_OC1Init(General_TIM, &TIM_OCInitStructure);
                //使能TIMX在CCR1上的预装载寄存器
                TIM_OC1PreloadConfig(General_TIM, TIM_OCPreload_Enable);

//                TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
//                TIM_OCInitStructure.TIM_Pulse = General_TIM_PULSE2;
//                TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
//                TIM_OC2Init(General_TIM, &TIM_OCInitStructure);
//                TIM_OC2PreloadConfig(General_TIM, TIM_OCPreload_Enable);
//               
//                TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
//                TIM_OCInitStructure.TIM_Pulse = General_TIM_PULSE3;
//                TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
//                TIM_OC3Init(General_TIM, &TIM_OCInitStructure);
//                TIM_OC3PreloadConfig(General_TIM, TIM_OCPreload_Enable);
//               
//                TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
//                TIM_OCInitStructure.TIM_Pulse = General_TIM_PULSE4;
//                TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
//                TIM_OC4Init(General_TIM, &TIM_OCInitStructure);
//                TIM_OC4PreloadConfig(General_TIM, TIM_OCPreload_Enable);

                // 使能计数器
                TIM_Cmd(General_TIM, ENABLE);

}


火哥,我发给你看看,这样子行不行?
回复 支持 反对

使用道具 举报

发表于 2017-3-18 09:58:20 | 显示全部楼层
爱学习的小伙伴 发表于 2017-3-17 20:40
#include "stm32f10x.h"
#include "bsp_led.h"
#include "bsp_usart1.h"

直接测试啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-18 15:46:29 | 显示全部楼层

好像串口发送不行啊,你帮我看看什么原因
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-19 17:23:28 | 显示全部楼层

好像串口发送不行啊,你帮我看看什么原因
回复 支持 反对

使用道具 举报

发表于 2018-4-16 21:57:44 | 显示全部楼层
您好,您能把这个程序源码发我一份么,1920253318@qq.com  谢谢
回复 支持 反对

使用道具 举报

发表于 2018-9-22 01:38:45 | 显示全部楼层
大佬,你成功做出来了吗?能不能把源代码发给我参考一下啊~感激不尽
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-3 03:06 , Processed in 0.036276 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表