@@ -25,7 +25,8 @@ extern "C" {
25
25
#endif
26
26
27
27
static int _readResolution = 10 ;
28
- static int _writeResolution = 10 ;
28
+ static int _ADCResolution = 10 ;
29
+ static int _writeResolution = 8 ;
29
30
30
31
// Wait for synchronization of registers between the clock domains
31
32
static __inline__ void syncADC () __attribute__((always_inline , unused ));
@@ -43,20 +44,23 @@ static void syncDAC() {
43
44
44
45
void analogReadResolution ( int res )
45
46
{
47
+ _readResolution = res ;
46
48
syncADC ();
47
- switch ( res )
49
+ if ( res > 10 )
48
50
{
49
- case 12 :
50
- ADC -> CTRLB .bit .RESSEL = ADC_CTRLB_RESSEL_12BIT_Val ;
51
- break ;
52
- case 8 :
53
- ADC -> CTRLB .bit .RESSEL = ADC_CTRLB_RESSEL_8BIT_Val ;
54
- break ;
55
- default :
56
- ADC -> CTRLB .bit .RESSEL = ADC_CTRLB_RESSEL_10BIT_Val ;
57
- break ;
51
+ ADC -> CTRLB .bit .RESSEL = ADC_CTRLB_RESSEL_12BIT_Val ;
52
+ _ADCResolution = 12 ;
53
+ }
54
+ else if (res > 8 )
55
+ {
56
+ ADC -> CTRLB .bit .RESSEL = ADC_CTRLB_RESSEL_10BIT_Val ;
57
+ _ADCResolution = 10 ;
58
+ }
59
+ else
60
+ {
61
+ ADC -> CTRLB .bit .RESSEL = ADC_CTRLB_RESSEL_8BIT_Val ;
62
+ _ADCResolution = 8 ;
58
63
}
59
- _readResolution = res ;
60
64
}
61
65
62
66
void analogWriteResolution ( int res )
@@ -179,7 +183,7 @@ uint32_t analogRead( uint32_t ulPin )
179
183
ADC -> CTRLA .bit .ENABLE = 0x00 ; // Disable ADC
180
184
syncADC ();
181
185
182
- return valueRead ;
186
+ return mapResolution ( valueRead , _ADCResolution , _readResolution ) ;
183
187
}
184
188
185
189
@@ -190,11 +194,6 @@ uint32_t analogRead( uint32_t ulPin )
190
194
void analogWrite ( uint32_t ulPin , uint32_t ulValue )
191
195
{
192
196
uint32_t attr = g_APinDescription [ulPin ].ulPinAttribute ;
193
- // uint32_t pwm_name = g_APinDescription[ulPin].ulTCChannel ;
194
- uint8_t isTC = 0 ;
195
- uint8_t Channelx ;
196
- Tc * TCx = 0 ;
197
- Tcc * TCCx = 0 ;
198
197
199
198
if ( (attr & PIN_ATTR_ANALOG ) == PIN_ATTR_ANALOG )
200
199
{
@@ -203,10 +202,12 @@ void analogWrite( uint32_t ulPin, uint32_t ulValue )
203
202
return ;
204
203
}
205
204
205
+ ulValue = mapResolution (ulValue , _writeResolution , 10 );
206
+
206
207
syncDAC ();
207
208
DAC -> DATA .reg = ulValue & 0x3FF ; // DAC on 10 bits.
208
209
syncDAC ();
209
- DAC -> CTRLA .bit .ENABLE = 0x01 ; //Enable ADC
210
+ DAC -> CTRLA .bit .ENABLE = 0x01 ; // Enable DAC
210
211
syncDAC ();
211
212
return ;
212
213
}
@@ -218,15 +219,15 @@ void analogWrite( uint32_t ulPin, uint32_t ulValue )
218
219
pinPeripheral ( ulPin , g_APinDescription [ulPin ].ulPinType ) ;
219
220
}
220
221
221
- Channelx = GetTCChannelNumber ( g_APinDescription [ulPin ].ulPWMChannel ) ;
222
+ Tc * TCx = 0 ;
223
+ Tcc * TCCx = 0 ;
224
+ uint8_t Channelx = GetTCChannelNumber ( g_APinDescription [ulPin ].ulPWMChannel ) ;
222
225
if ( GetTCNumber ( g_APinDescription [ulPin ].ulPWMChannel ) >= TCC_INST_NUM )
223
226
{
224
- isTC = 1 ;
225
227
TCx = (Tc * ) GetTC ( g_APinDescription [ulPin ].ulPWMChannel ) ;
226
228
}
227
229
else
228
230
{
229
- isTC = 0 ;
230
231
TCCx = (Tcc * ) GetTC ( g_APinDescription [ulPin ].ulPWMChannel ) ;
231
232
}
232
233
@@ -263,12 +264,12 @@ void analogWrite( uint32_t ulPin, uint32_t ulValue )
263
264
ulValue = mapResolution (ulValue , _writeResolution , 8 );
264
265
265
266
// Set PORT
266
- if ( isTC )
267
+ if ( TCx )
267
268
{
268
269
// -- Configure TC
269
270
270
- // DISABLE TCx
271
- TCx -> COUNT8 .CTRLA .reg &=~( TC_CTRLA_ENABLE ) ;
271
+ // Disable TCx
272
+ TCx -> COUNT8 .CTRLA .reg &= ~ TC_CTRLA_ENABLE ;
272
273
// Set Timer counter Mode to 8 bits
273
274
TCx -> COUNT8 .CTRLA .reg |= TC_CTRLA_MODE_COUNT8 ;
274
275
// Set TCx as normal PWM
@@ -283,16 +284,15 @@ void analogWrite( uint32_t ulPin, uint32_t ulValue )
283
284
else
284
285
{
285
286
// -- Configure TCC
286
-
287
- // DISABLE TCCx
288
- TCCx -> CTRLA .reg &=~(TCC_CTRLA_ENABLE );
287
+ // Disable TCCx
288
+ TCCx -> CTRLA .reg &= ~TCC_CTRLA_ENABLE ;
289
289
// Set TCx as normal PWM
290
290
TCCx -> WAVE .reg |= TCC_WAVE_WAVEGEN_NPWM ;
291
291
// Set TCx in waveform mode Normal PWM
292
292
TCCx -> CC [Channelx ].reg = (uint32_t )ulValue ;
293
293
// Set PER to maximum counter value (resolution : 0xFF)
294
294
TCCx -> PER .reg = 0xFF ;
295
- // ENABLE TCCx
295
+ // Enable TCCx
296
296
TCCx -> CTRLA .reg |= TCC_CTRLA_ENABLE ;
297
297
}
298
298
@@ -301,9 +301,7 @@ void analogWrite( uint32_t ulPin, uint32_t ulValue )
301
301
302
302
// -- Defaults to digital write
303
303
pinMode ( ulPin , OUTPUT ) ;
304
-
305
304
ulValue = mapResolution (ulValue , _writeResolution , 8 );
306
-
307
305
if ( ulValue < 128 )
308
306
{
309
307
digitalWrite ( ulPin , LOW ) ;
0 commit comments