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;
}
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
Let'sdo第3期任务合集被打赏50分 | |
与电子爱好者谈读图四被打赏50分 | |
Let‘s do 第三季 [电子测光表] 基础任务和进阶任务成果展示被打赏50分 | |
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 |