你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

动态PWM,setcompare函数不起作用

[复制链接]
知秋一叶ol 提问时间:2019-3-20 13:49 /
#include "stm32f10x.h"
void RCC_Config(void);
void GPIO_Config(void);
void TIM2_2_Config(void);
void TIM3_Config(void);
void delay_ms(int a);
int main()
{
RCC_Config();
TIM2_2_Config();
TIM3_Config();
GPIO_Config();

u16 ledpwmval=0;u8 dir=1;
while(1)
{
  //u16 ledpwmval=0;u8 dir=1;
  if(TIM_GetFlagStatus(TIM3, TIM_FLAG_Update)==SET)
  {
   TIM_ClearFlag(TIM3, TIM_FLAG_Update);
   GPIOC->ODR=~GPIO_ReadOutputData(GPIOC);
  }
  delay_ms(50);
  if(dir)ledpwmval++;
  else ledpwmval--;
  
  if(ledpwmval>200)dir=0;
  if(ledpwmval==0)dir=1;           
  TIM_SetCompare2(TIM2,ledpwmval);
}
}

void delay_ms(int a)
{
while(a--);
}
void RCC_Config(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
}

void GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_SetBits(GPIOC,GPIO_Pin_13);

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);


}
void TIM2_2_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;

TIM_TimeBaseInitStructure.TIM_Prescaler=0;
TIM_TimeBaseInitStructure.TIM_Period=899;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
TIM_ITConfig(TIM2,TIM_IT_Update, ENABLE);
/*------------------------------------------------------------------------*/
// NVIC_InitTypeDef NVIC_InitStructure;
// NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;
// NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
// NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;
// NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
// NVIC_Init(&NVIC_InitStructure);

/*------------------------------------------------------------------------*/
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState=ENABLE;
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
TIM_OC2Init(TIM2,&TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM2,ENABLE);


TIM_Cmd(TIM2, ENABLE);
}
//void TIM2_IRQHandler(void)   
//{
// if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
//  {
//   TIM_ClearITPendingBit(TIM2, TIM_IT_Update  );  
//   GPIOA->ODR=~GPIO_ReadOutputData(GPIOA);
//  }
//// GPIOA->ODR=~GPIO_ReadOutputData(GPIOA);
//}
void TIM3_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;

TIM_TimeBaseInitStructure.TIM_Prescaler=7199;
TIM_TimeBaseInitStructure.TIM_Period=10000;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
TIM_ARRPreloadConfig(TIM3,ENABLE);

TIM_Cmd(TIM3, ENABLE);
}


不知道问题出在哪里,,占空比一直不变,,
收藏 评论4 发布时间:2019-3-20 13:49

举报

4个回答
七哥 回答时间:2019-3-20 15:19:06
不清楚你这哪里有问题,看是看不出来的。跑一下这个程序,只不过是TIM3的
STM32F103_PWM_OUT.rar (455.62 KB, 下载次数: 4)

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

zhongya618 回答时间:2019-3-20 19:07:40
收藏
五哥1 回答时间:2019-3-25 19:07:12
兄弟,咱写程序能加一下注释吗?这么长没法耐着性子往下看,不如看看正点原子哥的程序,还有要学习HAL库的程序,简单好用,问题少, 如果是HAL库的程序没有变化,一般把上面这个函数  HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);放在初始化地方就好了。

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

g921002 回答时间:2019-3-25 20:03:06
本帖最后由 g921002 于 2019-3-25 20:04 编辑

兄弟,如果你要用PWM直接CubeMX設定一下。
開頭跑一下
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);

要變更duty就用instance直接操作暫存器比較快
htim2.Instance->CCR1 = duty;

要變週期就
htim2.Instance->ARR = period;

用HAL,要直接操作暫存器也是很快的。

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版