切换到宽版
  • 11110阅读
  • 45回复

[ARM]GD32F103RET6  DAC 功能测试 [复制链接]

上一主题 下一主题
离线cao57508

发帖
2219
M币
4218
专家
9
粉丝
81
只看该作者 20楼 发表于: 2016-12-13
数控电源的坑填了没?
本帖最近打赏记录:共1条打赏M币+3
离线wyn20007

发帖
70
M币
395
专家
0
粉丝
7
只看该作者 21楼 发表于: 2016-12-15
值得学习。
离线ynymwtb

发帖
681
M币
3867
专家
10
粉丝
34
只看该作者 22楼 发表于: 2017-08-27
回 huaweiwx 的帖子
huaweiwx:        是的,先在arduino下快速开发原型,无论是pwm还是ADC,也包括lcd都是方便的 ,调好后改用C或核心部分用汇编取得更高效和更快的响应速度,还有mcu的模拟比较器可以用来做些报警保护之类的工作。
就是pwm的频率低了点,否则可以直 .. (2016-11-01 00:12) 回 huaweiwx 的帖子

请问大师,如何调整arduino下pwm频率,测试了用arduino控制494不太成功
离线huaweiwx

发帖
1326
M币
184
专家
57
粉丝
251
只看该作者 23楼 发表于: 2017-08-27
回 ynymwtb 的帖子
ynymwtb:
请问大师,如何调整arduino下pwm频率,测试了用arduino控制494不太成功
回 ynymwtb 的帖子

并不是所有版本都直接提供改变analogWrite 的PWM频率功能,通常都是固定频率,这样有两种方法,一是修改核心代码中频率部分,二是自己设置time 的pwm输出,但有些版本能,
以下已经包含了在用户应用层实现改变PWM频率的功能:

koduino:https://github.com/avikde/koduino:
提供了以下功能:
void analogWriteFrequency(uint8_t pin, int freqHz)  //设置analogWrite频率,否则缺省是1000HZ
以后再用  analogWrite(pin,val)输出的就是该频率的pwm波形了。

在这个实现中:http://bbs.mydigit.cn/read.php?tid=2168292
已提供一个PWM的函数:
void pwmWrite(uint8_t pin, int  dutyCycle, int frequency, int durationMillis)
前三个参数分别是 脚号pin 、  占空比 dutyCycle、  频率 frequency,最后一个为输出持续时间(0 为 一直输出);
因此,精细控制pwm输出就直接用这个函数如:
pwmWrite(PA1,0X8000,100000,0) ;
就是在  PA1 上,输出占空比  0x8000/0x10000 =50%,频率为 100000HZ的连续方波;
完整的程序:
  1. void setup() {                
  2.   pinMode(PA1, OUTPUT);
  3.   analogWriteResolution(16);
  4.   pwmWrite(PA1, 0x8000,100000, 0);
  5. }
  6. void loop() {
  7. }


其他如  otto maple 等还需要自己设置定时器通道。


离线ynymwtb

发帖
681
M币
3867
专家
10
粉丝
34
只看该作者 24楼 发表于: 2017-08-28
回 huaweiwx 的帖子
huaweiwx:并不是所有版本都直接提供改变analogWrite 的PWM频率功能,通常都是固定频率,这样有两种方法,一是修改核心代码中频率部分,二是自己设置time 的pwm输出,但有些版本能,
以下已经包含了在用户应用层实现改变PWM频率的功能:
koduino:https://github.com/avikde/koduino:
.. .. (2017-08-27 16:10) 回 huaweiwx 的帖子

谢谢,回头我试一试
离线ynymwtb

发帖
681
M币
3867
专家
10
粉丝
34
只看该作者 25楼 发表于: 03-31
不知新发布IDE环境下DAC示例在哪里
离线huaweiwx

发帖
1326
M币
184
专家
57
粉丝
251
只看该作者 26楼 发表于: 03-31
ynymwtb:
不知新发布IDE环境下DAC示例在哪里


没有做DAC的示例,这个版本的ARDUINO,本着兼容全系列芯片,而且最大限度的少占用资源,所以没有用DAC,其他有部分版本的STM32 arduino使用dac做模拟输出(analogWrite),这个版本没有用,因为:
1 不是每个应用都会用到DAC输出;
2 通常用DAC来生成各种形状的波形,甚至产生音频音乐,应用繁多,无法一一集成这些复杂应用,因此干脆留给用户自己扩充;
3 用户扩充方便;

实现方法:
1 用CubeMx生成DAC初始化代码;包含了三个函数;

2 在arduino ide建一个新的sketch;
3 将1  CubeMx生成的DAC_HandleTypeDef hdac; 变量声明拷贝到2 新建的sketch最前面,把dac.c中的三个函数拷贝到sketch最后;
4 用 extern “C" 的花 {}将 HAL_DAC_MspInit和HAL_DAC_MspDeInit括起来,这是因为 ino是按C++处理的,而这两个函数是hal库需要按c格式调用的 ,
这样形成如下结构:


可以试试是否能通过编译,通常会出现
_Error_Handler(__FILE__, __LINE__); 函数未定义的错误,干脆把这语句删了。

5 现在我们可以在setup()中调用 MX_DAC_Init();来初始化DAC通道了,这个示例是初始化通道1,并用  HAL_DAC_Start(&hdac,DAC_CHANNEL_1);
来启动转换;
6 现在我们可以写入需要输出的DAC值了:
7 示例是从0开始到4095(12bit)dac输出累加1,周而复始,这是锯齿波输出,将其放在loop()中;
for(uint32_t out= 0;out <4096;out++){
     HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, out);
    delay(1);  
}
编译通过后将其另存为 dactest

全部代码:
  1. DAC_HandleTypeDef hdac;
  2. void setup() {
  3.   // put your setup code here, to run once:
  4.   MX_DAC_Init();
  5.   HAL_DAC_Start(&hdac, DAC_CHANNEL_1);
  6. }
  7. void loop() {
  8.   // put your main code here, to run repeatedly:
  9.   for (uint32_t out = 0; out < 4096; out++) {
  10.     HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, out);
  11.   }
  12. }
  13. /* DAC init function */
  14. void MX_DAC_Init(void)
  15. {
  16.   DAC_ChannelConfTypeDef sConfig;
  17.   /**DAC Initialization
  18.   */
  19.   hdac.Instance = DAC;
  20.   if (HAL_DAC_Init(&hdac) != HAL_OK)
  21.   {
  22.   }
  23.   /**DAC channel OUT1 config
  24.   */
  25.   sConfig.DAC_Trigger = DAC_TRIGGER_NONE;
  26.   sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
  27.   if (HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_1) != HAL_OK)
  28.   {
  29.   }
  30. }
  31. extern "C" {
  32.   void HAL_DAC_MspInit(DAC_HandleTypeDef* dacHandle)
  33.   {
  34.     GPIO_InitTypeDef GPIO_InitStruct;
  35.     if (dacHandle->Instance == DAC)
  36.     {
  37.       /* USER CODE BEGIN DAC_MspInit 0 */
  38.       /* USER CODE END DAC_MspInit 0 */
  39.       /* DAC clock enable */
  40.       __HAL_RCC_DAC_CLK_ENABLE();
  41.       /**DAC GPIO Configuration
  42.         PA4     ------> DAC_OUT1
  43.       */
  44.       GPIO_InitStruct.Pin = GPIO_PIN_4;
  45.       GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  46.       HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  47.       /* USER CODE BEGIN DAC_MspInit 1 */
  48.       /* USER CODE END DAC_MspInit 1 */
  49.     }
  50.   }
  51.   void HAL_DAC_MspDeInit(DAC_HandleTypeDef* dacHandle)
  52.   {
  53.     if (dacHandle->Instance == DAC)
  54.     {
  55.       /* USER CODE BEGIN DAC_MspDeInit 0 */
  56.       /* USER CODE END DAC_MspDeInit 0 */
  57.       /* Peripheral clock disable */
  58.       __HAL_RCC_DAC_CLK_DISABLE();
  59.       /**DAC GPIO Configuration
  60.         PA4     ------> DAC_OUT1
  61.       */
  62.       HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4);
  63.       /* USER CODE BEGIN DAC_MspDeInit 1 */
  64.       /* USER CODE END DAC_MspDeInit 1 */
  65.     }
  66.   }
  67. } // extern "C"


下载后,可以用示波器来看PA4的输出的图形:(示例针对的是stm32f103)



[ 此帖被huaweiwx在2018-04-01 23:21重新编辑 ]
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
离线huaweiwx

发帖
1326
M币
184
专家
57
粉丝
251
只看该作者 27楼 发表于: 03-31
回 ynymwtb 的帖子
ynymwtb:请问大师,如何调整arduino下pwm频率,测试了用arduino控制494不太成功
 (2017-08-27 13:28) 回 ynymwtb 的帖子

你可以仿照我上述例子写一个库, 包含
dac_ini()  ;含启动dac
dac_write_channel1()
dac_write_channel2()

抽空我来完成这部分;
离线zszc

发帖
8
M币
-41
专家
0
粉丝
2
只看该作者 28楼 发表于: 07-17
回 huaweiwx 的帖子
huaweiwx:你可以仿照我上述例子写一个库, 包含
dac_ini()  ;含启动dac
dac_write_channel1()
dac_write_channel2()
....... (2018-03-31 21:24) 回 huaweiwx 的帖子

请问大神,DAC的库放出来了吗?
离线ynymwtb

发帖
681
M币
3867
专家
10
粉丝
34
只看该作者 29楼 发表于: 07-17
huaweiwx的回复给了很好的思路,也就是用stm32的库,让arduino更完美兼容stm32