打印
[STM32F1]

用STM32F103VC的TIM1可以输出PWM周期和占空比同时可调吗?

[复制链接]
5443|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
盛夏的葡萄|  楼主 | 2015-3-20 09:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现在想使用STM32F103VC的TIM1产生占空比和周期同时可变的功能:
当前TIM1产生周期为A,占空比为A1的方波;
1秒后,TIM1产生周期为B,占空比为B1的方波;
就这样交替循环。
现在现象是:只产生1秒周期为A,占空比为A1的方波,接下来是1秒高电平,如此循环,为什么方波B不能产生?

TIM1_PWM_Init(65535,0);
TIM_SetCompare1(TIM1,10000);
while(1)
{
TIM1->ARR = 10000;   // 波形A
TIM1->CCR1 = 65535;
delay_ms(1000);

TIM1->ARR = 500;   // 波形B
TIM1->CCR1 = 4096;
delay_ms(1000);

}

ARR不可以动态变更吗?
沙发
huzi2099| | 2015-3-20 10:07 | 只看该作者
初始化程序不要锁定设置和预装载

使用特权

评论回复
板凳
盛夏的葡萄|  楼主 | 2015-3-20 10:36 | 只看该作者
huzi2099 发表于 2015-3-20 10:07
初始化程序不要锁定设置和预装载

huzi2099 ,可否列出对应的寄存器位,还是没找到。

使用特权

评论回复
地板
mmuuss586| | 2015-3-20 12:23 | 只看该作者
可以,不过这么几句,不够;
楼主控制步进吧?

使用特权

评论回复
5
盛夏的葡萄|  楼主 | 2015-3-20 12:53 | 只看该作者
mmuuss586 发表于 2015-3-20 12:23
可以,不过这么几句,不够;
楼主控制步进吧?

普通的直流电机。
mmuuss586,可否详述。

使用特权

评论回复
6
81190865| | 2015-3-20 14:06 | 只看该作者
TIM_CR1的UDIS位怎么设置的?

使用特权

评论回复
7
盛夏的葡萄|  楼主 | 2015-3-20 14:16 | 只看该作者
81190865 发表于 2015-3-20 14:06
TIM_CR1的UDIS位怎么设置的?

UDIS这位为0

使用特权

评论回复
8
盛夏的葡萄|  楼主 | 2015-3-20 14:22 | 只看该作者
81190865 发表于 2015-3-20 14:06
TIM_CR1的UDIS位怎么设置的?

程序去掉ARR的更新,占空比是可以改变的。
现在就是周期更新不了。

使用特权

评论回复
9
盛夏的葡萄|  楼主 | 2015-3-20 14:57 | 只看该作者
mmuuss586 发表于 2015-3-20 12:23
可以,不过这么几句,不够;
楼主控制步进吧?

mmuuss586 ,你来多说几句,分析分析。

使用特权

评论回复
10
guangbiao| | 2015-3-20 17:04 | 只看该作者
ST的TIM设计很下工夫的,多看几遍手册,你肯定能找出你要的实现方法。

使用特权

评论回复
11
xjjspace| | 2015-3-20 17:20 | 只看该作者
TIM1_PWM_Init(65535,0);
方便的话这个函数贴出来看下。

使用特权

评论回复
12
盛夏的葡萄|  楼主 | 2015-3-20 18:57 | 只看该作者
xjjspace 发表于 2015-3-20 17:20
TIM1_PWM_Init(65535,0);
方便的话这个函数贴出来看下。

// STM32F10x_StdPeriph_Lib_V3.5.0
void TIM1_PWM_Init(u16 arr,u16 psc)
{  
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        TIM_OCInitTypeDef TIM_OCInitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);  
            
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        TIM_TimeBaseStructure.TIM_Period = arr;
        TIM_TimeBaseStructure.TIM_Prescaler =psc;
        TIM_TimeBaseStructure.TIM_ClockDivision = 0;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
        TIM_OC1Init(TIM1, &TIM_OCInitStructure);

        TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);

        TIM_Cmd(TIM1, ENABLE);
        TIM_CtrlPWMOutputs(TIM1, ENABLE);
}

使用特权

评论回复
13
盛夏的葡萄|  楼主 | 2015-3-20 19:02 | 只看该作者
guangbiao 发表于 2015-3-20 17:04
ST的TIM设计很下工夫的,多看几遍手册,你肯定能找出你要的实现方法。

嗯,接触STM32不到一周,肯定是我自己使用的问题;这个卡了2天,所以上来请教。

使用特权

评论回复
14
mmuuss586| | 2015-3-20 19:40 | 只看该作者
盛夏的葡萄 发表于 2015-3-20 12:53
普通的直流电机。
mmuuss586,可否详述。

可以试着,把初始化相关程序,都刷新一遍看看;

引脚设置就不用刷新了;

使用特权

评论回复
15
ilikerome| | 2015-3-21 07:58 | 只看该作者
看到这个delay_ms(1000); 我倒了

LZ你是要产生1S周期的A波,而不是延迟1S,两码事。

大循环什么都不要做直接 while(1){}就可以了

更新ARR CCR的值在中断里面进行。
讲的很清楚的了,自己体会吧。

使用特权

评论回复
16
盛夏的葡萄|  楼主 | 2015-3-27 12:28 | 只看该作者
谢谢楼上的各位。
其实这个问题可以参考:https://bbs.21ic.com/icview-175841-1-1.html

使用特权

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

本版积分规则

4

主题

51

帖子

1

粉丝