这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » aagreen0514 ARM DIY进程帖

共43条 4/5 |‹ 1 2 3 4 5 跳转至
高工
2012-04-27 08:56:54     打赏
31楼

DAC 三角波和正弦波 实现 一会儿上图 和 源程序


高工
2012-04-27 12:00:08     打赏
32楼

三角波
程序
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);
}


高工
2012-04-27 12:01:02     打赏
33楼

高工
2012-04-27 12:02:39     打赏
34楼
下面是正弦波

高工
2012-04-27 12:03:55     打赏
35楼

#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);
}


高工
2012-04-27 13:17:24     打赏
36楼

温度 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; 
}


高工
2012-04-28 09:50:13     打赏
37楼

快放假了 回去 准备 做 sd了


专家
2012-04-28 10:22:00     打赏
38楼
装备很齐全啊,羡慕,另外,楼主的程序很有借鉴意义

高工
2012-04-28 12:05:06     打赏
39楼

呵呵 学校的示波器 借了一台  程序希望有点帮助吧


高工
2012-05-03 09:31:43     打赏
40楼

五一在家玩了几天 呵呵 sd卡 继续中


共43条 4/5 |‹ 1 2 3 4 5 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]