35
35
#include "stm32f4xx_hal.h"
36
36
#include "PeripheralPins.h"
37
37
38
- #define RANGE_12BIT (0xFFF)
38
+ #define DAC_RANGE (0xFFF) // 12 bits
39
+ #define DAC_NB_BITS (12)
39
40
40
41
DAC_HandleTypeDef DacHandle ;
41
42
static DAC_ChannelConfTypeDef sConfig ;
@@ -98,14 +99,14 @@ void analogout_free(dac_t *obj)
98
99
{
99
100
}
100
101
101
- static inline void dac_write (dac_t * obj , uint16_t value )
102
+ static inline void dac_write (dac_t * obj , int value )
102
103
{
103
104
HAL_StatusTypeDef status = HAL_ERROR ;
104
105
105
106
if (obj -> channel == 1 ) {
106
- status = HAL_DAC_SetValue (& DacHandle , DAC_CHANNEL_1 , DAC_ALIGN_12B_R , value );
107
+ status = HAL_DAC_SetValue (& DacHandle , DAC_CHANNEL_1 , DAC_ALIGN_12B_R , ( value & DAC_RANGE ) );
107
108
} else if (obj -> channel == 2 ) {
108
- status = HAL_DAC_SetValue (& DacHandle , DAC_CHANNEL_2 , DAC_ALIGN_12B_R , value );
109
+ status = HAL_DAC_SetValue (& DacHandle , DAC_CHANNEL_2 , DAC_ALIGN_12B_R , ( value & DAC_RANGE ) );
109
110
}
110
111
111
112
if ( status != HAL_OK ) {
@@ -128,31 +129,27 @@ void analogout_write(dac_t *obj, float value)
128
129
if (value < 0.0f ) {
129
130
dac_write (obj , 0 ); // Min value
130
131
} else if (value > 1.0f ) {
131
- dac_write (obj , (uint16_t ) RANGE_12BIT ); // Max value
132
+ dac_write (obj , (int ) DAC_RANGE ); // Max value
132
133
} else {
133
- dac_write (obj , (uint16_t )(value * (float )RANGE_12BIT ));
134
+ dac_write (obj , (int )(value * (float )DAC_RANGE ));
134
135
}
135
136
}
136
137
137
138
void analogout_write_u16 (dac_t * obj , uint16_t value )
138
139
{
139
- if (value > (uint16_t )RANGE_12BIT ) {
140
- value = (uint16_t )RANGE_12BIT ; // Max value
141
- }
142
-
143
- dac_write (obj , value );
140
+ dac_write (obj , value >> (16 - DAC_NB_BITS ));
144
141
}
145
142
146
143
float analogout_read (dac_t * obj )
147
144
{
148
-
149
145
uint32_t value = dac_read (obj );
150
- return (float )value * (1.0f / (float )RANGE_12BIT );
146
+ return (float )value * (1.0f / (float )DAC_RANGE );
151
147
}
152
148
153
149
uint16_t analogout_read_u16 (dac_t * obj )
154
150
{
155
- return (uint16_t )dac_read (obj );
151
+ uint32_t value = dac_read (obj );
152
+ return (value << 4 ) | ((value >> 8 ) & 0x000F ); // Conversion from 12 to 16 bits
156
153
}
157
154
158
155
#endif // DEVICE_ANALOGOUT
0 commit comments