OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3005|回复: 3

主从模式 精确PWM个数输出

[复制链接]

2

主题

15

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2017-7-28
在线时间
12 小时
发表于 2017-8-8 16:28:27 | 显示全部楼层 |阅读模式
24金钱
我实在别人的基础上改的程序,出处:http://www.openedv.com/forum.php ... mp;page=1#pid604070
我使用TIM3在单脉冲模式下工作,控制TIM2输出精确个数的pwm脉冲,PB10为TIM2的重映射功能。(同时另外两个引脚输出高电平,但这个不影响其它应该)
软件仿真,PB10一直没有脉冲输出,请大家帮忙看看代码,指导一下有什么问题?提前谢谢了。

#include "stm32f10x.h"
#include "tim.h"
void TIM2_TIM3_PWM(u16 Cycle, u16Pulse_Num);   
void Motor_Init(u16 TIM3per, u16 TIM2per,u16 TIM2Compare1);
int main(void)
{
   Motor_Init(1000, 1000, 1000);
  TIM2_TIM3_PWM(1000, 1500);
GPIO_SetBits(GPIOB,GPIO_Pin_1);
GPIO_SetBits(GPIOB,GPIO_Pin_11);
    while (1);
                // add your code;
}
#include "tim.h"
void Motor_Init(u16 TIM3per, u16 TIM2per,u16 TIM2Compare1)
         {
    TIM_TimeBaseInitTypeDefTIM_TimeBaseInitStruct;
    TIM_OCInitTypeDef TIM_OCInitStruct;
    GPIO_InitTypeDef GPIO_InitStructure;
            
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 |RCC_APB1Periph_TIM3,ENABLE);// 打开时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB,ENABLE);//打开时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//打开复用时钟
    GPIO_PinRemapConfig(GPIO_FullRemap_TIM2,ENABLE);  //重映射时钟
                  
    GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;//复用推挽输出
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//
    GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
           
                  
    GPIO_InitStructure.GPIO_Pin=  GPIO_Pin_1 | GPIO_Pin_11;// I/O输出
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&GPIO_InitStructure);   
                  
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                  
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_PinRemapConfig(GPIO_FullRemap_TIM2,ENABLE);    //完全重映射
  
                  
           //TIM3工作在单脉冲模式下
           TIM_TimeBaseInitStruct.TIM_ClockDivision =TIM_CKD_DIV1;
           TIM_TimeBaseInitStruct.TIM_CounterMode =TIM_CounterMode_Up;
              TIM_TimeBaseInitStruct.TIM_Prescaler= 7200;          TIM_TimeBaseInitStruct.TIM_Period = TIM3per;
          TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
            
          TIM_SelectOnePulseMode(TIM3,TIM_OPMode_Single);//单脉冲配置
          TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);//使能预装载
           TIM_SelectOutputTrigger(TIM3,TIM_TRGOSource_OC1Ref);//作为触发输出
            
           TIM_OCInitStruct.TIM_OCMode =TIM_OCMode_PWM2;
           TIM_OCInitStruct.TIM_OutputState =TIM_OutputState_Enable;
           TIM_OCInitStruct.TIM_OCPolarity =TIM_OCPolarity_High;
           TIM_OCInitStruct.TIM_Pulse = 1;
           TIM_OC1Init(TIM3,&TIM_OCInitStruct);
            
           TIM_Cmd(TIM3,DISABLE);//先不使能
            
            
           //TIM2
           TIM_TimeBaseInitStruct.TIM_ClockDivision =TIM_CKD_DIV1;
           TIM_TimeBaseInitStruct.TIM_CounterMode =TIM_CounterMode_Up;
           TIM_TimeBaseInitStruct.TIM_Prescaler = 720;
           TIM_TimeBaseInitStruct.TIM_Period = TIM2per;
          TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);
            
           TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Gated);//门控模式,高电平使能
          TIM_SelectMasterSlaveMode(TIM2,TIM_MasterSlaveMode_Enable);//主从模式使能
           TIM_SelectInputTrigger(TIM2,TIM_TS_ITR2);//选择触发源
            
           TIM_OCInitStruct.TIM_OCMode =TIM_OCMode_PWM2;
           TIM_OCInitStruct.TIM_OutputState =TIM_OutputState_Enable;
           TIM_OCInitStruct.TIM_OCPolarity =TIM_OCPolarity_High;
           TIM_OCInitStruct.TIM_Pulse = TIM2Compare1;//比较捕获的预装载值
           TIM_OC3Init(TIM2,&TIM_OCInitStruct);
            
           TIM_Cmd(TIM2,ENABLE);
         }
         
         
         voidTIM2_TIM3_PWM(u16 Cycle, u16 Pulse_Num) //Cycle周期,Pulse_Num脉冲个数
         {
           u16 TIM2per = 0;
           u32 Time = 0;
              
           Time = Cycle * Pulse_Num;
           Time /= 100;         //预分频7200100us计数一次     
           TIM2per = Cycle/10;   //预分频72010us计数一次
            
           TIM_SetAutoreload(TIM3, Time+1); //设置TIM3重装值
           TIM_SetAutoreload(TIM2, TIM2per-1); //设置TIM2重装值
           TIM_SetCompare1(TIM2,TIM2per/2); //设置占空比50%
           TIM_Cmd(TIM3,ENABLE); //使能
         }

端口.png
通道.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

158

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2017-4-20
在线时间
102 小时
发表于 2017-8-9 16:41:35 | 显示全部楼层
直接实验  有时候仿真是不出波形的 但实际是有脉冲的
回复

使用道具 举报

2

主题

15

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2017-7-28
在线时间
12 小时
 楼主| 发表于 2017-8-9 19:47:49 | 显示全部楼层
564646396 发表于 2017-8-9 16:41
直接实验  有时候仿真是不出波形的 但实际是有脉冲的

谢谢。
已经实验过了,依然没有波形。
回复

使用道具 举报

5

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2017-9-2
在线时间
33 小时
发表于 2017-11-3 10:20:30 | 显示全部楼层
定时器的配置检查了没
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 04:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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