关于定时器产生两个PWM波,定义两个中间变量传送值的问题。

2019-08-17 08:57发布

今年干入手stm32f103rct6。
我在用TIM1产生两个PWM波,一个是通道1(PA8),一个是通道4(PA11)。但是在定义中间变量的时候就出现问题。
先说下正常没有问题时:
pwm.h里的:

void TIM1_PWM_Init(void );

pwm.c里的:

void TIM1_PWM_Init(void )
{  
  GPIO_InitTypeDef GPIO_InitStructure;

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);//
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);  //使能GPIO外设时钟使能
                                                                       
   //设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_11; //TIM_CH1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

TIM_TimeBaseStructure.TIM_Period = 65535; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值                                      
TIM_TimeBaseStructure.TIM_Prescaler =7199; //设置用来作为TIMx时钟频率除数的预分频值  不分频
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim                                                      
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_Pulse = 35000; //设置待装入捕获比较寄存器的脉冲值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OC1Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
  TIM_CtrlPWMOutputs(TIM1,ENABLE); //MOE 主输出使能
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH1预装载使能  

TIM_OCInitStructure.TIM_Pulse = 12000; //设置待装入捕获比较寄存器的脉冲值
TIM_OC4Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH4预装载使能  

TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器

TIM_Cmd(TIM1, ENABLE);  //使能TIM1

}

main函数里的:
int main(void)
{
u16 adcx;
float temp;
delay_init();       //延时函数初始化   
LED_Init();     //初始化与LED连接的硬件接口
LED0=0;
uart_init(9600);   //串口初始化为9600
  LCD_Init();
  Adc_Init();      //ADC初始化
TIM1_PWM_Init();  

  POINT_COLOR=RED;//设置字体为红 {MOD}
LCD_ShowString(60,50,200,16,16,"STM32F103RCT6");
  LCD_ShowString(60,70,200,16,16,"ADC TEST");
LCD_ShowString(60,90,200,16,16,"COME FROM TICUP");
LCD_ShowString(60,110,200,16,16,"2017/5/24");

  //显示提示信息
POINT_COLOR=BLUE;//设置字体为蓝 {MOD}
LCD_ShowString(60,130,200,16,16,"ADC_CH0_VAL:");      
LCD_ShowString(60,150,200,16,16,"ADC_CH0_VOL:0.000V");

  while(1)
{
  //加入ADC自测是否有PWM

  adcx=Get_Adc_Average(ADC_Channel_1,10);
  adcx=adcx;
  LCD_ShowxNum(156,130,adcx,4,16,0);//显示计算分压后的实际ADC的值
  temp=(float)adcx*(3.3/4096);
  adcx=temp;
  LCD_ShowxNum(156,150,adcx,1,16,0);//显示电压值
  temp-=adcx;
  temp*=1000;
  LCD_ShowxNum(172,150,temp,3,16,0X80);
  
  delay_ms(10);
  
}
}

经过测试。这个程序是没有问题的
在此基础上我想加入变量asc和asx来传递pwm.c里的TIM_Pulse 数值来实现控制pwm的占空比。
更改后的文件不能输出两个pwm波(所以这里是有问题的,求大佬帮我看看)
pwm.h:里的
void TIM1_PWM_Init(u16 asc,u16 asx );

pwm.c:里的
void TIM1_PWM_Init(u16 asc,u16 asx)
{  
  GPIO_InitTypeDef GPIO_InitStructure;

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);//
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);  //使能GPIO外设时钟使能
                                                                       
   //设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_11; //TIM_CH1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

TIM_TimeBaseStructure.TIM_Period = 65535; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值                                      
TIM_TimeBaseStructure.TIM_Prescaler =7199; //设置用来作为TIMx时钟频率除数的预分频值  不分频
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim                                                      
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_Pulse = asc; //设置待装入捕获比较寄存器的脉冲值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OC1Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
  TIM_CtrlPWMOutputs(TIM1,ENABLE); //MOE 主输出使能
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH1预装载使能  

TIM_OCInitStructure.TIM_Pulse = asx; //设置待装入捕获比较寄存器的脉冲值
TIM_OC4Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH4预装载使能  

TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器

TIM_Cmd(TIM1, ENABLE);  //使能TIM1

}

main函数里的
int main(void)
{
u16 adcx;
u16 asc;
u16 asx;

float temp;
delay_init();       //延时函数初始化   
LED_Init();     //初始化与LED连接的硬件接口
LED0=0;
uart_init(9600);   //串口初始化为9600
  LCD_Init();
  Adc_Init();      //ADC初始化
asc=50000;
asx=2500;

  TIM1_PWM_Init(asc,asx);   

  POINT_COLOR=RED;//设置字体为红 {MOD}
LCD_ShowString(60,50,200,16,16,"STM32F103RCT6");
  LCD_ShowString(60,70,200,16,16,"ADC TEST");
LCD_ShowString(60,90,200,16,16,"COME FROM TICUP");
LCD_ShowString(60,110,200,16,16,"2017/5/24");

  //显示提示信息
POINT_COLOR=BLUE;//设置字体为蓝 {MOD}
LCD_ShowString(60,130,200,16,16,"ADC_CH0_VAL:");      
LCD_ShowString(60,150,200,16,16,"ADC_CH0_VOL:0.000V");

  while(1)
{
  
  //加入ADC自测是否有PWM
  
  adcx=Get_Adc_Average(ADC_Channel_1,10);
  adcx=adcx;
  LCD_ShowxNum(156,130,adcx,4,16,0);//显示计算分压后的实际ADC的值
  temp=(float)adcx*(3.3/4096);
  adcx=temp;
  LCD_ShowxNum(156,150,adcx,1,16,0);//显示电压值
  temp-=adcx;
  temp*=1000;
  LCD_ShowxNum(172,150,temp,3,16,0X80);

  delay_ms(10);
  
}
}
我已经用红 {MOD}字体把我想加入的变量标记出来,
这个程序在测试时通道1(PA8)并没有输出PWM,
通道4(PA11)输出的PWM占空比是定义给通道1的值(通道4输出的是asc对应的值,原本应该是asx对应的值才对)

于是我就不知道是哪里出了问题,可是在PWM.C里对TIM_Pulse 赋固定的值却,通道1和通道4都可以输出我的期望值。

请求大佬们,这是肿么了?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
JULYAB
1楼-- · 2019-08-17 09:22
图片的话,大神们就不用看了,我把代码都贴出来了呢。
JULYAB
2楼-- · 2019-08-17 15:19
自己顶一下,看有没有人知道,由于是新手没人教,这种基础我也不是太明白
JULYAB
3楼-- · 2019-08-17 18:52
 精彩回答 2  元偷偷看……
JULYAB
4楼-- · 2019-08-17 21:12
因为逻辑上都是没有问题的,所以编译也不会出错,但是结果就是不如人意,我搞不清楚这是为什么,难道所程序把通道1个关闭了?然后把原本给通道以的数值给了通道4?????、excuse???
JULYAB
5楼-- · 2019-08-18 02:51
这是基础问题么?
LYN的专注
6楼-- · 2019-08-18 03:22
本帖最后由 LYN的专注 于 2017-6-8 10:39 编辑

直接给数据 不要通过变量试试 我的是这样写的  TIM1_Int_Init(65535,36-1); 参数分别对应周期 和预分频。另外你可以单步调试看看 看问题出在哪儿

一周热门 更多>