本人,尝试用DAC控制通道输出固定电压。参考了野火利用定时器和DMA去生成正弦波的方法没有成功。将触发方式按照网上资料改为软件触发,添加相应函数仍为得到解决。后来才晓得DAC不是每个型号都有
这里我用无触发方式,将参数写入DAC_SetChannel1Data()即可,首先是DAC配置函数
void DAC_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
DAC_InitTypeDef DAC_InitStructure;
/* 使能GPIOA时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
/* 使能DAC时钟 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
/* DAC的GPIO配置,模拟输入 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* 配置DAC 通道1 */
DAC_InitStructure.DAC_Trigger = DAC_Trigger_None; //使用软件触发作为触发源
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; //不使用波形发生器
DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0;
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable; //不使用DAC输出缓冲
DAC_Init(DAC_Channel_1, &DAC_InitStructure);
DAC_Cmd(DAC_Channel_1, ENABLE);
}
配置好后,利用相关函数直接赋值给DAC,每三秒增加一点幅值,增加十次
int main(void)
{
delay_init(); //延时函数初始化
uart_init(115200); //串口初始化为115200
//配置DAC,12位0-4095.对应0-3.3v
DAC_Config();
while(1)
{
int i,a=0;
for(i=0;i<11;i++)
{
a = i*400;
//该函数控制对应通道输出电压的幅值
DAC_SetChannel1Data(DAC_Align_12b_R,a);
delay_ms(1500);
delay_ms(1500);
printf("a :%d \r\n",a);
}
}
}
利用adc采集结果
最后补充一点,我是在b站看了刘洋老师的DAC视频,才尝试使用无需触发的模式的。到最后也没搞清楚为什么用别的触发方式无法实现要求。也许是别的地方有问题。