DAC 三角波和正弦波 实现 一会儿上图 和 源程序
三角波 
程序
void DAC_init(void)
{
  DAC_InitTypeDef DAC_InitStructure;
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  
  /* TIM2 Periph clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  
  /* DAC Periph clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
  
  /* TIM2 Configuration */
  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  TIM_TimeBaseStructure.TIM_Period = 1;          
  TIM_TimeBaseStructure.TIM_Prescaler = 0;       
  TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;    
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  /* TIM2 TRGO selection */
  TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);
  /* DAC channel1 Configuration */
  DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO;
  DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_Triangle;
  DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_TriangleAmplitude_4095;
  DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;
  DAC_Init(DAC_Channel_1, &DAC_InitStructure);
 
  /* Enable DAC Channel1: Once the DAC channel1 is enabled, PA.04 is 
     automatically connected to the DAC converter. */
  DAC_Cmd(DAC_Channel_1, ENABLE);
 
  
  /* Set DAC dual channel DHR12RD register */
    DAC_SetChannel1Data(DAC_Align_12b_R,0);
  /* TIM2 enable counter */
  TIM_Cmd(TIM2, ENABLE);
}
#define DAC_DHR12RD_Address      0x40007420
const uint32_t Sine12bit[32] = {
                      2047, 2447, 2831, 3185, 3498, 3750, 3939, 4056, 4095, 4056,
                      3939, 3750, 3495, 3185, 2831, 2447, 2047, 1647, 1263, 909, 
                      599, 344, 155, 38, 0, 38, 155, 344, 599, 909, 1263, 1647};
oid DAC_init(void)
{
  DAC_InitTypeDef DAC_InitStructure;
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  DMA_InitTypeDef            DMA_InitStructure;
  
  /* DMA clock enable */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
  
  /* TIM2 Periph clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  
  /* DAC Periph clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
  
  /* TIM2 Configuration */
  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  TIM_TimeBaseStructure.TIM_Period = 71;          
  TIM_TimeBaseStructure.TIM_Prescaler = 0;       
  TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;    
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  /* TIM2 TRGO selection */
  TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);
  
  
  /* DAC channel1 Configuration */
  DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO;
  DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
//  DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_TriangleAmplitude_4095;
  DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;
  DAC_Init(DAC_Channel_1, &DAC_InitStructure);
  
  DMA_DeInit(DMA2_Channel3);
  DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12RD_Address;
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&Sine12bit;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
  DMA_InitStructure.DMA_BufferSize = 32;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(DMA2_Channel3, &DMA_InitStructure);
  /* Enable DMA2 Channel4 */
  DMA_Cmd(DMA2_Channel3, ENABLE);
 
  /* Enable DAC Channel1: Once the DAC channel1 is enabled, PA.04 is 
     automatically connected to the DAC converter. */
  DAC_Cmd(DAC_Channel_1, ENABLE);
 
  
  /* Set DAC dual channel DHR12RD register */
  //  DAC_SetChannel1Data(DAC_Align_12b_R,0);
    
  DAC_DMACmd(DAC_Channel_1, ENABLE);
    
  /* TIM2 enable counter */
  TIM_Cmd(TIM2, ENABLE);
}
温度 18b20 搞定 直接 上程序 
#include "stm32f10x.h"
#include<18b20.h>
#define DATA1()        GPIOA->BSRR  = GPIO_Pin_1;
#define DATA0()        GPIOA->BRR   = GPIO_Pin_1;
/***********************函数定义********** ***************************   
  *函数名称:       void DsDelay(unsigned int i)
  *功能描述:       DS18B20延时   
  *输入:           延时量 int型   
  *输出:           无       
  *调用模块:     整个文件         
************************************************************************/
void DsDelay(unsigned int time)
{
  u16 i=0;
  while(time--){
    i=60;
    while(i--);
  }
}
/***********************函数定义********** ***************************   
  *函数名称:       void Init_DS18B20(void)
  *功能描述:       DS18B20初始化   
  *输入:           无   
  *输出:           无       
  *调用模块:     unsigned int ReadTemperature(void)         
************************************************************************/
void Init_DS18B20(void)
{       
        u8 x;
        u32 temp;
 DATA1();      //DQ复位
 DsDelay(8);   //稍做延时
 DATA0();      //单片机将DQ拉低
 DsDelay(80);  //精确延时 大于 480us
 DATA1();      //拉高总线
 DsDelay(14);
        //把IO配置为输入模式
        GPIOA->CRL &= 0xFFFFFF0F;
        GPIOA->CRL |= 0x00000040; //输入模式
 temp=GPIOA->IDR;
        x=(temp&0x00000002);        //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
        GPIOA->CRL &= 0xFFFFFF0F;
        GPIOA->CRL |= 0x00000030; // 推挽输出最高速度50M
 DsDelay(20);
}
/***********************函数定义********** ***************************   
  *函数名称:       void Init_DS18B20(void)
  *功能描述:       DS18B20读一个字节   
  *输入:           无   
  *输出:           读出的数据 char型       
  *调用模块:     unsigned int ReadTemperature(void)         
************************************************************************/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
u32 temp,x;
 for (i=8;i>0;i--){
  DATA0();  // 给脉冲信号
  dat>>=1;
  DATA1();  // 给脉冲信号
                //把IO配置为输入模式
                GPIOA->CRL &= 0xFFFFFF0F;
                GPIOA->CRL |= 0x00000040; //输入模式
                temp=GPIOA->IDR;
                x=(temp&0x00000002);
  if(x){
   dat|=0x80;
  }
                //读取完毕后再次设置为输出模式
                GPIOA->CRL &= 0xFFFFFF0F;
                GPIOA->CRL |= 0x00000030; // 推挽输出最高速度50M
 DsDelay(4);
}
 return(dat);
}
/***********************函数定义********** ***************************   
  *函数名称:       void Init_DS18B20(void)
  *功能描述:       DS18B20写一个字节   
  *输入:           写入的数据 char型   
  *输出:           无       
  *调用模块:     unsigned int ReadTemperature(void)         
************************************************************************/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
 for (i=8; i>0; i--){
  DATA0();
                if(dat&0x01){
                  DATA1(); 
                }else{
                  DATA0();
                }
  DsDelay(5);
  DATA1();
  dat>>=1;
 }
}
/***********************函数定义********** ***************************   
  *函数名称:       void Init_DS18B20(void)
  *功能描述:       DS18B20读取温度   
  *输入:           无  
  *输出:           温度值 int型       
  *调用模块:     main()         
************************************************************************/
u16  ReadTemperature(void)
{
u16  t=0,wl=0xff,wh=0xff;
float TC;
 Init_DS18B20();
 WriteOneChar(0xCC); // 跳过读序号列号的操作
 WriteOneChar(0x44); // 启动温度转换
 Init_DS18B20();
 WriteOneChar(0xCC); //跳过读序号列号的操作
 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
 wl=ReadOneChar();
 wh=ReadOneChar();
 t=wl+(wh<<8);
 TC=t*0.0625;
 t=TC*10; 
 return (u16 )t; 
}
回复
| 有奖活动 | |
|---|---|
| 硬核工程师专属补给计划——填盲盒 | |
| “我踩过的那些坑”主题活动——第002期 | |
| 【EEPW电子工程师创研计划】技术变现通道已开启~ | |
| 发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
| 【EEPW在线】E起听工程师的声音! | |
| 高校联络员开始招募啦!有惊喜!! | |
| 【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
| 送您一块开发板,2025年“我要开发板活动”又开始了! | |
			
			
			
						
			
 我要赚赏金
