硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1184|回复: 8
收起左侧

[客户分享] 求助,STM32基本定时器+DAC问题

[复制链接]

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2024-7-1 16:34:28 | 显示全部楼层 |阅读模式

MCU:STM32F103RCT6
我想使用定时器6+DAC1输出一个1.1KHz,占空比为50%的方波
定时器6进入中断一次是高,再进入一次是低电平,大概就是这样,但是波形一直不对,而且频率是1.333KHz

下图是我的中断代码,本来用的if else写的,结果都一样

void TIM6_IRQHandler(void)
{
        static int dac1 = 0;
  if (TIM_GetITStatus(TIM6,TIM_IT_Update)!= RESET)
        {
               
                DAC_SetChannel1Data(DAC_Align_12b_R,wave_data[dac1]);  
                dac1++;
                if(dac1 == 2)dac1=0;
                TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
        }
}

01.png
下图是定时器的初始化

void TIM6_Init(void)
{
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);

  TIM_TimeBaseStructure.TIM_Period = 719;                //1000
  TIM_TimeBaseStructure.TIM_Prescaler = 43;  //32  *  2
//  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;   //基本定时器无此项
//  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
//        TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;/*重复计数寄存器*/
  TIM_TimeBaseInit(TIM6,&TIM_TimeBaseStructure);
       
        NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
  
        TIM_ClearFlag(TIM6,TIM_FLAG_Update);/*清更新标志位*/
  TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);/*使能中断*/
  TIM_Cmd(TIM6,ENABLE);  //使能TIM6计数器
}

02.png

下面是DAC的初始化

void Dac1_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        DAC_InitTypeDef DAC_InitType;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );//打开GPIOA          
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE );//打开DAC                   
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;                //设置PA4为DAC输出
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        GPIO_SetBits(GPIOA,GPIO_Pin_4)        ;
                                       
        DAC_InitType.DAC_Trigger=DAC_Trigger_None;        //不使用触发功能,软件触发
//        DAC_InitType.DAC_Trigger=DAC_Trigger_T6_TRGO;
        DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;//不使用波形发生
        DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;
        DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable ;        //DAC1输出缓存关闭
  DAC_Init(DAC_Channel_1,&DAC_InitType);         //

        DAC_Cmd(DAC_Channel_1, ENABLE);  //使能DAC1       
        DAC_SoftwareTriggerCmd(DAC_Channel_1,ENABLE);
//        DAC_SetChannel1Data(DAC_Align_12b_R, 0);
}


最后示波器的波形是这样的,有没有大佬指导一下,真的不知道问题在哪,好像定时器会自己进入中断一次,不知道怎么触发的
main函数里也很简单就初始化了一下DAC和定时器
03.jpg


回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2024-7-1 16:35:34 | 显示全部楼层
请大佬帮我看一下,心态爆炸了呜呜
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117542
QQ
发表于 2024-7-1 17:08:48 | 显示全部楼层
定时器中断里面再加入一个IO翻转,看看IO翻转速度多少
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2024-7-2 08:22:16 | 显示全部楼层
本帖最后由 344ma 于 2024-7-2 08:47 编辑
eric2013 发表于 2024-7-1 17:08
定时器中断里面再加入一个IO翻转,看看IO翻转速度多少
一样的1.32KHz
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2024-7-2 08:24:23 | 显示全部楼层
本帖最后由 344ma 于 2024-7-2 08:51 编辑
eric2013 发表于 2024-7-1 17:08
定时器中断里面再加入一个IO翻转,看看IO翻转速度多少

频率一直不对,是不是定时器配置的有问题,占空比也和DAC的一样
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
发表于 2024-7-2 15:26:39 | 显示全部楼层
有可能是分频不是整数导致得。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117542
QQ
发表于 2024-7-3 10:36:12 | 显示全部楼层

那就对了,这个定时器频率就是你真实的DAC频率。
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2024-7-3 16:02:43 | 显示全部楼层
空世格 发表于 2024-7-2 15:26
有可能是分频不是整数导致得。

用keil的仿真看了一下,SR就有问题,我后来将频率减小,就正常了,可能定时器us级别的硬件达不到,哈哈,后来用了滴答定时器
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2024-7-3 16:07:06 | 显示全部楼层
eric2013 发表于 2024-7-3 10:36
那就对了,这个定时器频率就是你真实的DAC频率。

定时器本身达不到这个频率,因为我要的是1.1KHz方波,定时器我就要设置2.2KHz,仿真SR时间间隔和波形一样,把频率调小,SR正常,波形正常,目前看了从硬件层面达不到要求,后来使用了滴答定时器
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-13 18:35 , Processed in 0.043039 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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